Podrías probar esto:
FROM workdone
LEFT JOIN staffcost ON workdone.date >= MAKEDATE(staffcost.costyear, 1)
AND workdone.date < MAKEDATE(staffcost.costyear+1, 1)
Esto permitirá el uso de un índice en workdone.date para buscar fechas entre el primer día del costyear hasta el primer día de costyear+1, pero sin incluirlo .
En general, este tipo de búsqueda de rango puede explotar índices donde las funciones (como YEAR(datestamp) ) no puede.