Trouble with "Volatile" qualifier

I was expecting the Loop to stop

Then your expectation was unreasonable. The tone function is non-blocking, which is a good thing, since you do not want to diddle around in an ISR.

Then the interrupt happens, the tone() function is called, to start a tone sounding. Then, the ISR ends, and loop() resumes. No less than 1/5 a second later, you stop the tone that is happening, or start another tone.

Since freq is not modified in the ISR, it doesn't need to be volatile.