"Immediate-execution is a side-effect"
How can a well-defined core behavior be considered a "side effect"?
I might concede that merily passing a function to a constructor isn't usually expected to imply that such function is immediately called (it's also why the "deferred paradigm" is usually preferred), but that's how it is.
Anyway, synchronous code can always be made asynchronous, but not the other way around (unless you're counting await as a way). The main point of promises is their resolution/rejection always happening as the next micro-task, even if they're called synchronously.
Honestly, the title is terribly clickbaity and OP should feel bad. Especially because it looks like a well estabilished library with 3.8k stars that doesn't need it.
But that makes me wonder: is Socket.IO so slow that can actually hurt performance in a "normal" use case? And when does it hurt?