I found the solution on another forum.
You need to add the ICACHE_RAM_ATTR attribute to the interrupt so it stays in cache.
void ICACHE_RAM_ATTR CLK_ISR() {
ClkCount++;
}
Now:
Freq is: 332596 - connected for 680s, operating at 160MHz
That's all I tested to, but 330kHz is a bit better than crashing at 7kHz, lol!
edit: I've discovered that it now crashes after exactly 1200s (20mins), repetitively.
I'm still investigating why, but I believe that it's some kind of watchdog timer.