Don’t confuse cores with threads. Threads are deployed to the cores for rendering. Sometimes adding more threads can give you a quicker render but sometimes not. It all depends upon the scene. If the overhead to manage the thread takes more time than the execution of that thread then you will loose time. But in your test scene it looks like the overhead of setting up another thread works in your favor.
The time savings you are experiencing is not that great, approximately a second. On my dual core laptop your scene renders in 22.16 seconds using 2 threads. When I render using 64 threads I get a time of 21.27. So with 32 more times threading I get about a second less in render time.
This is a simple scene, try adding a character to the scene, or some particles. Something that may require additional processing like constraints, expressions and or modifiers. At some point the scale will tip and the cost of issuing that extra thread will exceed the savings and your render time will increase.
It is a nice feature to play with, however, I like seeing more buckets on screen when it renders too!
I would not treat this as a rule of thumb. Adding more threads divides the time spent by the CPU on what is a CPU-intensive workload. The number of threads should correspond to the number of cores, and then only if the total hardware can actually drive all cores “full steam ahead” without bottleneck; not often the case. You might be happier with a thread-count that is, say, one less than the number of cores.