This is expected since SQL generated will do a cartesian product. Castesian product with an empty table will return nothing.
Even if you had stuffs in Alarm, this is highly unefficient since the castesian product can be huge (nb of line of event * nb of line of incident * nb of line of alarm).
Sub query and in would solve your pb I guess
from event as event where event in (<sub querywith restrictions>) or (other sub query with restiction)
Code:
from Event event, Alarm alarm where event in (from Incident incident where (incident=event and incident.confirmed = :false) or event in (from Alarm alarm where (alarm=event and alarm.acknowledged=:false)"