I created a custom ScrollViewer by wrapping the existing one with a custom control. I made a TemplatePart of type ScrollViewer, which my default style defined. Then I made my own corresponding "HorizontalOffset", "ScrollToVerticalOffset()", etc members that passed on the call to the actual scroll viewer. If you did this then you could make a callback on your custom dependency properties that fires an event.
Of course, a scroll event would be much cleaner, so hopefully MSFT will implement it in a later version.
[Edit: On second thought, this probably won't work for you if you are still letting the user scroll using the scroll bars. In my case I implemented a different method of scrolling (dragging on the content to "pan") so the scroll viewer's properties never changed except through my custom control.]