I think there is some misunderstanding here of what a thread is. I'll try to explain in non-programmer language, so some details and examples might be a little off, simply to make it understandable.
A thread is a piece of code (a loop in a program for example) that has to be executed. Let's say we want to do something simple such as (1 + 1). We create a thread to calculate (1 + 1). Your operating system is now informed that you made a thread to calculate (1 + 1). However, your operating system has to use the CPU for other stuff too, such as calculating all the values you see in the taskmanager that you have open in the background. There is currently no CPU core available to do your calculation.
Once your operating system thinks it has time to do your (1 + 1) calculation, it will load that thread to the CPU and tell it to execute the code (do the calculation).
Once it is done with your calculation, your operating system will now tell the CPU to continue calculating all that stuff for taskmanager. Everything I just said can be summarized in the below picture from Wikipedia:
This example shows thread execution on a system with one CPU core. (Yes, you can have threading with only 1 processing unit!)
Now in 2021 we of course have systems that have a lot more than just 1 CPU core, which means we can execute stuff at the same time. This is also where it gets complicated and where most of the misunderstanding of threading comes from.
For big programs such as Assetto Corsa, we can now split the program into parts that can be executed in parallel.
Assetto Corsa is split into two large, important parts and a whole bunch of small, less important parts. The two large parts are the physics (LOTS of calculations, a lot of times per second) and the main loop. The main loop is for stuff like making the buttons clickable, telling your GPU (videocard) what to draw on your screen and so on.
We can run these parts in parallel and the operating system tells the CPU when and where to execute the code for these. However, they need to be synchronized. The physics part obviously can't still be calculating my physics for turn 1 while the main loop is drawing turn 4 on my screen. One will have to wait for the other. This only gets more complicated when you split a program up into more parallel parts.
Now, these two big parts we've split the game up into, the physics and the main loop, they both create more than one thread too. However, this does not mean that these are all executed in parallel, due to some things being dependent on others being completed.
Try to set THREADS to number of cores
Found description for those
[PHYSICS_THREADING]
THREADS=-1 ; -1 = automatic , 0 = disabled , 1...N number of threads dedicated to physics
So when Andrew suggested to set the number of threads to the number of CPU cores you have, you really shouldn't. The physics engine might need WAY more than those 4, 8, 16 and so on... The key here is that threads are not necessarily executed in parallel.
In conclusion, Assetto Corsa can in theory utilize all of your CPU cores. In practice, only 1 or 2 are significantly used. A lot of the time you'll only see one, as the physics calculations take the most time and the other parts will just be waiting for the physics to be done.
This post became a bit longer than I originally envisioned, but I hope it was clear enough.