I'm confused as to how this "no side-effects" philsophy works with asynchronous programming. By asynchronous programming I mean ...
That would be the point, then.
A sound, no side-effect style is incompatible with frameworks that depend on state. Find a new framework.
Python's WSGI standard, for example, allows us to build no side-effect applications.
The idea is that the various "state changes" are reflected by an environment of values that can be built incrementally. Each request is a pipeline of transformations.