First, I will caution you on the use of events in SystemVerilog. They should be used only by advanced users, and the use of event.triggered() is for people working around the mistakes they made incorrectly using events. Actually, it’s not that bad, but I would always think of a better way before reverting to using an event.
Remember that @(expression) means block waiting for any change in the value of that expression, or block waiting for the valueless trigger of an event. Both the change and triggering are instantaneous occurrences, and the ordering of the @() versus the change/trigger is critical. Trying to do both at the same time is the cause of many race conditions.
wait(expression) means block waiting for the expression to become true. If the expression is already true when executing the wait statement, it does not block at all, so ordering is not as critical. You cannot use the wait statement with a named event because an event has no value, it can only be triggered instantaneously.
The triggered method of an event is a function that returns true if the event has been triggered in the current time step. It continues to return true until the end of the current time step.
In both your examples, e1.triggered() is already true. So @(e1.triggered()) blocks until the end of the time step when e1.triggered() changes to return false. wait(e1.triggered() never blocks because it is already true.