I will tell it in a clear and simple way and clear the confusion:
Node's event loop is SINGLE-THREADED but the other processes are NOT.
The confusion came from C++, which Node uses under the hood (NodeJS is about 30% JS + 70% C++). So, by default the JS part of NodeJS is single-threaded BUT it uses a thread pool of C++. So, we have a single threaded JS which is the event loop of NodeJS + 4 threads of C++ if needed for asynchronous I/O operations.
It is also important to know that the event loop is like a traffic organizer, every request goes through the loop (which is single-thread). The event loop then organizes those requests to the pool threads if I/O processes are needed. If you have a high computational tasks like heavy lifting image-processing, video-editing, audio-processing or 3d-graphics, etc. (which is not needed for most apps), then NodeJS will be a bottleneck for you.
NodeJS shines for I/O bound apps (which is the case with most apps) that perform tasks like dealing with databases and filesystem.
Again, by default, NodeJS uses a 4 thread pool (PLUS one thread for the event loop itself) - a total of 5 threads.
As a general idea, the CPU could contain one or more cores, it depends on your server(money).
Each core could have threads. Watch your activity monitor and discover how many threads you are using.
Each process has multiple threads.
The multi-threading of Node is because node depends on V8 and libuv (C Library).
So long story short -
Node is single-threaded for the event loop itself but there are many operations that are done outside the event loop(like crypto and file system). If you have two calls for crypto then each of them will reach a THREAD (imagine 3 calls to crypto and 1 for fs, these calls will be distributed one for each thread from the 4 threads in the thread pool).
Finally: It is very easy to increase the default number of threads of the C-Library libuv thread pool which is 4 by default by changing the value of process.env.uv_threadpool_size. And also you could use clustering (PM2 recommended) to clone the event-loop and have multiple event-loops in case the single-threaded one is not enough for your computationally heavy app.
So nobody illustrates that thread pool is a C++ thing that’s in control of NodeJS and mostly not meant to be controlled by the developer.
Hope that simplifies things.