I created a quick prototype to examine the problem, I managed to get the control to preserve the selection but as new lines where added to the view the selection moved to the visible top of the control, but the selection did stay there as more lines where added, it did not matter how many lines were selected either.
So in effect, apart from the selection not locking to the exact offset position I got part the way there.
I was doing all this using a timer set to a100ms interval to add lines using the AppendText method.
I tried using a StringBuilder to hold the text but that had the same result.
Eventually, I created a derrived control from a RichTextBox and implemented my own version of AppendText which removed the tendancy of the control to scroll down.
I think that is the way to go, I stopped the development as I am sure you'll figure the rest out, but the AppendText function is what to shoot for in my opinion.
Depending on the frequency of updates, there is an slight issue of flicker but again, with carefull management of the user selection I think you'll crack it easily (Use the MouseDown event to clear the selection)
Update:
I managed to fix the position exactly using the AutoScrollOffset rather than scrolling to the selection itself, it seemed more accurate to do so.
It does seem clear there needs to be some kind of buffer/queue that is on a seperate thread to pump new lines to control when it best suited to do so, allowing for smoother interaction by the user. By this I mean the control waits until the user has finished making a selection before new lines are added.
Doing all this on 100ms intervals without some kind of bufferdid create flicker on the selection but only slightly