Because multithreading introduces a lot of complexity, making it inflexible and hard to scale. Of course you would never do it if the code was fast enough to not have to.
I never had to consider it, I could generate about 16 complete flow fields per frame on a 512x512 map with no quadtree optimization.
It sounds like a nice way to learn webworkers, but I think you're always better off hitting the perf bottleneck first, rather than trying to design around it early.
No reading up, but somewhere there was a blog post by the programers and a reference to the paper
All an agent has to do is query their current spot in the graph and it will return a vector that leads them to the next lowest cost. This is useful if you have lots of agents going to the same location.
https://www.youtube.com/watch?v=BHcQ4JCj27w
The description of this video has a lot of good resources. I made it when I was a much much worse programmer though so I wouldn't bother actually watching the video lol.
[1] - http://www.gameaipro.com/GameAIPro/GameAIPro_Chapter23_Crowd...