Yes, web workers create actual threads (or processes, the specification is flexible on this). According to the Web Workers specification, when the worker is created, the first step:
Create a separate parallel runtime (i.e. a separate thread or process or equivalent construct) and follow the remaining steps in this context.
For the purpose of time APIs, this is the official moment of creating the worker.
(W3C Web Workers 4.4 section)
Thus, it is explicitly stated that the code executed in Web Workers is executed in real threads or processes.
Although you can use Workers without threads (note the language of "equivalent construction") for use on systems that do not support threads, all browser implementations implement web workers as threads.
source share