Ammo.js May 3, 2017 build (ammo.js) - a bonus entry, it's a 3D physics engine, 2D boxes were simulated by cubes.
Notes
All of the engines are single-threaded, some don't even max out one core
All of the engines are CPU-only, no GPU (WebGL/WebCL) option
Emscripten-compiled engines die after a certain number of boxes with something like Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ..., even when there's lots of free RAM.
WASM seems to help. In case of Box2D it allows for ~500 more boxes at the same tick rate
Plank and PhysicsJS have stuttering problems
Ammo, being 3D, did very well. I think it would surpass Box2D if they implemented a pure 2D mode. Probably will never happen.
Box2D has the worst documentation. They basically refer you to the source they compiled from, which doesn't really match what you have to do in JS.
It's hard to make the engines simulate similarly. Some form a nice pile of blocks, some spread them around. I tried setting friction / restitution manually, and still couldn't make them behave the same way.