While I think your use case for events is clearly a good one, I’ve also seen the pattern abused, e.g. a widget opens a dialog selector and the selector fires an event to transmit the selection rather than just returning a promise that it resolves.
Events seem the perfect fit for pub/sub like you describe where there is a one to many relationship, but the pattern does seem abused by people who use it for a one to one communication between parts of the code. Calling it an anti-pattern is perhaps a bit too harsh and detracts from the valid uses. Though, I am glad the author brought it up as too many events in the system can make it challenging to reason about.