The FFT processing uses a separate buffer for the sample data rather than the user-provided buffer because a different amount of sample data may be required. For example, a 2048 sample FFT performed on a stereo 16-bit stream will require 8192 bytes (2048x2x2) of sample data, while the FFT result (and therefore the user-provided buffer to receive it) will only be 4096 bytes (1024x4). So the FFT processing gets data from the source into a temporary buffer and then performs the FFT and places the result in the user-provided buffer. Dummy streams don't provide any data of their own, so FFT processing doesn't work properly with them, ie. the FFT processing doesn't get any data from the dummy stream and it's left to process whatever randomness is sitting in the temporary buffer
You could instead use a push stream, ie. give it the sample data via BASS_StreamPutData and get back the FFT data from BASS_ChannelGetData. It could look something like this...
fftstream=BASS_StreamCreate(freq, chans, BASS_STREAM_DECODE, STREAMPROC_PUSH, 0); // create push stream with same format as the sample data
// perform 2048 sample FFT
BASS_StreamPutData(fftstream, data, 2048*chans*2); // feed sample data to the push stream
BASS_ChannelGetData(fftstream, fft, BASS_DATA_FFT2048); // get back the FFT