Esta é outra abordagem.
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)")
Mesmo fazer a ideia de um ORM é que você abstraia o SQL, nesse tipo de consulta complexa, acho melhor escolher a solução mais simples e não complicar ainda mais a consulta.