Esto hará lo que quieres, aunque no sé cuál será su rendimiento. Los nombres de los campos no son los mismos que los tuyos (hice una pequeña base para probar y adopté otros; las relaciones las hago con agentes.id y evaluaciones.idagente
La clave está en hacer la consulta y luego establecer una relación left join con el resultado de la consulta. Como decías, con las condiciones de fecha futuras no encuentra a los agentes que tengan evaluaciones. Ahora busca primero con un inner join, sin necesidad de usar el OR de la fecha y luego cruza esos resultados con las tablas agente y evaluaciones ya con un left join.
Cita: SELECT agentes.agente, ifnull( T1.eval, '0' ) evaluaciones
FROM agentes
LEFT JOIN (
SELECT a.id, COUNT( idagente ) eval
FROM agentes a
INNER JOIN `evaluaciones` e ON a.id = e.idagente
WHERE e.fecha
BETWEEN '2008/08/25'
AND '2008/08/30'
GROUP BY a.id
)T1 ON agentes.id = T1.id
LEFT JOIN evaluaciones ON evaluaciones.idagente = agentes.id
GROUP BY agentes.id
Adapta esto a los nombres de tus campos y creo que ahora funcionará.
OBSERVA que yo uso BETWEEN ... AND... entre las fechas, y la función IFNULL para poner los ceros.