Este es otro enfoque.
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)")
Aunque la idea de un ORM es que abstraigas el SQL, en este tipo de consultas complejas, creo que es mejor elegir la solución más simple y no complicar aún más la consulta.