Many of us are sometimes confused with what it means that NodeJS is both single-threaded, and async. So, it's a bit more complicated than that.
NodeJS core contains an non-blocking loop for requests. The received requests is immediately sent for processing and the listening process resumes. This way, NodeJS's primary thread is almost always ready to accept new requests. Data can be processed either in other threads or on other servers (like in case of a distributed system or a distributed database).
Here is a nice explanation by slebetman about the way NodeJS operates at its core: