El primer detalle que veo, es que tienes en la cláusula "where", detalles que involucran a la tabla de garantías. Lo que sucede en ese caso es que al hacer el "join" te envía los datos que encuentra, pero despúes de eso, filtra lo que concuerde con "b.tecnico = a.tecnico", eliminando así todos los que no concuerden con esa cláusula y por eso solo te trae un registro. Es mejor que muevas del where todo lo que involucre a la tabla garantías, a la parte del join.
Código SQL
[-]
select a.TECNICO,coalesce(sum(b.UNDS),0)
from RELTECPAS a
left outer join GARANTIAS b on a.TECNICO = b.TECNI and a.PASO = b.PASO and b.FASIG >= '19.07.2010'
where a.PASO = '04'
group by a.TECNICO
¿eso no funciona?