To jest inne podejście.
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)")
Nawet idea ORM polega na tym, że abstrahujesz SQL, w tego rodzaju złożonym zapytaniu, myślę, że lepiej wybrać najprostsze rozwiązanie i nie komplikować zapytania jeszcze bardziej.