I mean that the Timer class is not the HighResolutionTimer class. IIRC there’s no dedicated thread. So the callbacks are managed by the event loop. If your executable is a GUI JUCEApplication forget my question, but in the contrary (DLL, plug-in, command-line or such) the message loop must be created and started somewhere. There’s various workaround to achieve that, but IMHO you should use the HighResolutionTimer class cited above that is part of the juce_core module.
EDIT : “Wonder whether it’s anything to do with being a console app?” Yes, that’s what i mean