I don't think it's as a clean a separation as that. Emscripten supplies many things. Some libc-like, some os-like, including a filesystem api. This adds things like pipes, concurrent processes, signals and sockets, and makes the emscripten filesystem api shared across "processes" (web workers). It's borrowing from other code, too, like BrowserFS.
That's pretty right, with the addition that other things can target Browsix (like the gopherjs toolchain). Emscripten provides default implementations of a bunch of syscalls (and even a way to embed a file system), and we override those to instead do actual syscalls to a shared kernel (running in JS)