So in the callback, I use the BASS_GetData method to get the level of the signal, and once it exceeds a certain threshold I treat that as a "hit". Is that correct?
If you implement your processing as DSP you don't need Bass_GetData. The dsp callback is fed with a sample data buffer.
An advantage of a DSP is you can add instances to any bass audio channels you want. You also get simple access to sample buffer data.
It's true that you don't get callbacks per sample, so buffer latency is a factor when you want your analysis to be "realtime on sample"... but I guess you don't really need that. Just for non realtime processing it does not matter. In any case you can use the sample position to perfectly pin the timing point when your spike occurred.
To get better realtime behaviour you need small buffers. Follow Ian's recommendation and try WasApi or ASIO.
To experiment with Asio get the free "ASIO4all" driver to get asio with your built in sound card. Otherwise only special (external) audio interfaces come with dedicated asio driver support.
And BTW, read the introduction I've pointed to. It's very good and I refer myself to it with pleasure from time to time.