Hay que tener en cuenta que existe unas UDF que implementan el substring y lo usan de una forma diferente, así que es bueno ver que en los códigos del UDF no se encuentre creado substring, también sría bueno saber que versión de Firebird usa? H.Codigo es un string o un int?
Por último y aunque no creo que afecte mucho podrías cambiar el orden a lo siguiente:
Código SQL
[-]
LEFT JOIN Bancos H ON H.Codigo = SUBSTRING(A.Iban FROM 5 FOR 4) AND A.IdCuenta = 'A'
LEFT JOIN Bancos I ON I.Codigo = SUBSTRING(A.Iban FROM 1 FOR 4) AND A.IdCuenta = 'B'