NodeJS uses a single-threaded, event-driven, non-blocking I/O model. Unlike multi-threaded servers, slow tasks don't block the main thread. Instead, the event loop delegates I/O-bound tasks (like network requests) to the libuv library and worker threads, allowing concurrent handling of numerous requests without freezing the application. This makes it efficient for I/O-heavy applications but less ideal for CPU-bound tasks, which can still bottleneck the single thread.