Questo è un altro approccio.
Offer.find_by_sql("SELECT * FROM offers o WHERE NOT EXISTS (SELECT * FROM products WHERE products.offer_id = o.id AND service_id IS NULL)")
Anche se l'idea di un ORM è che astratti l'SQL, in questo tipo di query complessa, penso che sia meglio scegliere la soluzione più semplice e non complicare ulteriormente la query.