The above statement is not correct. libuv is not used if the underlying OS service performs it's own non blocking strategy. If the underlying OS service is blocking, the node implementation will usually wrap the operation as async by using a thread and continuing to execute other JS code on the main thread.
Context switching does not happen because more or less threads are available. The only side effect of having more threads is some ram that is allocated.
Native libraries that can be loaded, usually also make use of libuv. There is a chapter on libuv for instance on the Oracle node driver manual. There it is specifically noted that the Oracle driver performs exchanges with the DB in a libuv thread - so to have multiple connections to the DB open and doing work, it is highly recommended to up process.env.UV_THREADPOOL_SIZE
Please also note of the line of code below, it is totally wrong, you have to set this before node starts, setting it from within node has no effect.
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;