Thanks for the replies. To answer the questions, I've tried every combination of real-time/fast bounce to tracks and they don't make any difference. I've tried turning on/off options like 64-bit engine, fast bounce, different bit depths, dithering on/off. There's no hardware-reliant effects being used and I've made sure the fades are big enough.
What I don't understand is that if I play the project back and listen in real time there is absolutely no click at the crossfaded points. It's only if I try to render using Tracks/Bounce To Tracks or Export>Audio that the clicks appear (they are very small but enough that I can hear them and as I provide audio for broadcast I need to make sure the tracks are as clean as possible). And they only ever appear at the point where the crossfade was, nowhere else in the track.
To make it more confusing, it often happens randomly. Let's say there are four points in the audio track where I've split and crossfaded, a click might appear at one point but not another, but then on a different render it might be on one of the other crossfades, but always on a crossfaded segment.
The only way I've found so far to get a rendered track without clicks is to literally record 'what you hear' onto a new track while the project is playing in real time. But I thought this was effectively the same process as deselecting Fast Bounce during render (which doesn't work the same and will produce a click).
I'm just at the point where I don't trust Sonar to give me a true clean render of my audio without having to put headphones on and listen intently after every render.