con group by y having creo que puedes sacarlo
Código SQL
[-]
select a.codigocliente, max(a.fecha) , b.codigo, b.nombre
from clientes b
left outer join ventas a on a.codigocliente = b.codigo
group by a.codigocliente, b.codigo, b.nombre
having (max(fecha) < :parametro) or (max(fecha) is null)
el left outer join es para sacar tambien aquellos clientes que no tengan ninguna venta, he puesto la sintaxis de Interbase que es la que conozco, pero deberias tener un equivalente casi seguro, ya que es sql del 92.
La anterior tambien es válida, aunque creo (solo creo, no estoy seguro) que si tienes muchos registros esta deberia ser mas rápida
PD: :Parametro seria la fecha contra la que quieres chequear, asignala desde el mismo delphi que creo que será mas facil