Las reglas no cambiaron, siempre fue así (por lo menos desde que era Interbase/Firebird 1.0.
Si algo no cambia, el new.value y el old.value serán iguales.
De todos modos no entiendo como haces la asociación. Supongo que has omitido el hecho de que la tabla lotes tiene también el cliente...
En ese caso, deberías verificar si esta disponible o no, solamente en el momento de asociar a un cliente. Quedaría algo así:
Código SQL
[-]
CREATE trigger asociar_lote_cliente for lotes
active before update position 0
AS
begin
if (new.cliente <> old.cliente) then
begin
if (new.estado_lote = 'OCUPADO' and old.estado_lote = 'OCUPADO') then
begin
exception lote_no_disponible;
end
end
end