It appears that all you need to achieve the thing you are after is setting a SnapMaxTransform="false" on the ScrollView. That will keep the top overflow elastic, but clamp at the bottom:
As for changing things when you’ve scrolled away from the start of a ScrollView by a given distance, use WhileScrolled instead:
<ScrollView ux:Name="sv">
<WhileScrolled To="Start" Within="height(sv)" Invert="true">
<DebugAction Message="scrolled away from the start of ScrollView by the distance of its height" />
</WhileScrolled>
...
</ScrollView>