WebWorkers changed that in the browser. Could have always spawned child processes in Node or via utilities like PM2.
Except you can do different IO operations in the same user thread.
Parallelizing calls without synchronicity problems
Javascript APIs expose callback interfaces, and the callbacks are called on the thread that scheduled it. The real concurrency happens behind the scenes and is handled by the browser. So no, Javascript is not single-threaded in practice.
Not really? On a language level, sure, but with native IO, web workers, shared memory and Node.js clusters, I don't think it's fair to say JavaScript has no concurrency.