It depends on what kind of processing you need to do:
If the processing is I/O, Node.js uses asynchronous non-blocking I/O so you can generally just process each request individually and they'll be handled in parallel because Node.js won't block the event loop while waiting for I/O to happen. (This is why you don't use the xyzSync API calls; they block.)
If it's a lot of CPU processing rather than I/O, you can use separate threads for it via workers.
I understand JavaScript is a single threaded language.
Until fairly recently, JavaScript the language was silent on the topic of threads, and fully concurrent multiple-threading implementations did and do exist (for instance, JavaScript support in the Java JDK).
More recently, though, the specification has added the concept of agents and the idea that an agent has a single executing thread so, in general, there's only one thread acting within a given global environment (only one thread changing shared variables, absent the use of SharedArrayBuffer). But there can be multiple agents in an environment, as there are on web browsers (different windows can have different threads, web workers have their own threads, etc.) and Node.js (worker threads), and they can even share memory via SharedArrayBuffer.