Ville sådan noget virke? Jeg har haft tilfælde, der ligner din, og jeg fjernede simpelthen joinforbindelsen fra den hierarkiske forespørgsel og anvendte den først bagefter for at undgå at miste rækker.
SELECT TaskName, Sum(ts.hours) "TotalHours"
FROM (
SELECT replace(sys_connect_by_path(decode(level, 1, t.name), '~'), '~') As TaskName, t.id
FROM tasks t
START WITH PARENTOID=-1
CONNECT BY PRIOR t.id = t.parent_id
) tasks
INNER JOIN timesheets ts ON tasks.id=ts.task_id
GROUP BY TaskName Having Sum(ts.hours) > 0 ORDER BY TaskName