How about putting contenteditable="false" on your uneditable spans?
That seems so obvious I assume you can't do that for some reason.
IE is frustrating and it's very diifficult (sometimes impossible) to
place the caret precisely at node boundaries. It's where the
abstraction starts to show through. I'm not sure whether there's a
nice way to fix it in this instance. There's a hack you could use:
place a zero-width space character (I've used a Unicode BOM character,
U+FFEF, for this purpose before) at the start of the text node
following the uneditable span and set the caret immediately after
that. That does leave you either with stray zero-width space
characters in your content or the task of cleaning them up later.
Tim