Yes, an asynchronous function usually isn't pure, as it conflicts with requirement #2: no side effects.
Most things that we use asynchronous functions for are inherently side-effectful: I/O, network stuff, timers. But even if we ignore those, promises alone rely on some kind of global state for their asynchrony: the event loop. This typically doesn't fit within our definition of purity.
On the other hand, we can simply ignore those when arguing about purity of our functions, just as we ignore all the low-level effects and timings that a computation has on our real-world machine. If you want to argue that your asynchronous function is pure, you should however always state this assumption explicitly. When arguing about the equivalence of two asynchronous values, you will need to have a sophisticated idea of how you model asynchronous effects, e.g. in the evaluation of Promise.race
.