So I FINALLY worked out what was causing this annoying problem (for anyone who's interested).
I had "non destructive MIDI editing" unchecked in the preferences. With this unchecked, MIDI clips will be truncated to the edge of the rightmost note in them after you move or copy them. So if you have a MIDI clip of size 7:840 and you drag that clip out to a size of 8:0, then as soon as you move or copy it, the size will be truncated back to 7:840. The manual's explanation of this setting is:
Select this option to make all MIDI editing non-destructive. When toggled on, this option forces deleted data to be retained even though it is not visible.
You can see what's going on in Sonar's clumsy way (sort of). When you stretch out a MIDI clip so that part of it is blank, Sonar sees this blank section as "deleted data" and retains it. Of course what it's doing is "retaining" data that wasn't even there in the first place - you've just fooled it into thinking that there is deleted data by stretching the clip out to include blank space.
And I guess I didn't fully articulate why this is so important to me: I regularly stretch MIDI clips out to the nearest bar so that I can easily click on them and loop them. If you've got a MIDI drum clip that's 7:840 and you select it and shift-L, the loop points are going to be set to a width of 7:840 instead of 8:0, meaning the loop is going to be out of rhythm. Of course I could set it by drag selecting the bars on the timeline, but this is a pain. Anyway it doesn't matter now because I FINALLY got this sorted!