Igual hay motores como SQL Server, al menos la versión 6, que no funcinoarían poniendo un where de esta manera.
Dada la naturaleza del query, podes basarte en
not exists (eso si, no se si lo soporta mysql, que es bastante "rarito"
Código SQL
[-]
Select *
from catalogo cat
where not exists (Select 1
from DetalleVentas dv
inner join Ventas v on v.VentaID = dv.VentaID
where dv.CodigoProducto = cat.CodigoProducto
and v.Fecha between Fecha1 and Fecha2);
Hasta luego.