これに対する答えは、いくつかの実験の後、痛々しいほど明白になりました。
ScrollViewer のHeightプロパティを指定することは、すべてが期待どおりに機能するために欠けていた部分でした。
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
Height="350"> <!-- THIS was the missing piece!! -->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Controls:TreeView Grid.Row="0" ItemsSource="{Binding ListOne}"
ItemTemplate="{StaticResource ListOneTemplate}" >
</Controls:TreeView>
<Controls:TreeView Grid.Row="1" ItemsSource="{Binding ListTwo}"
ItemTemplate="{StaticResource ListTwoTemplate}" >
</Controls:TreeView>
</Grid>
</ScrollViewer>
FWIW、Grid、GridRows、およびTreeViewの高さと最大高さの設定など、他の多くのソリューションを試しました。また、グリッドの高さが変更されるたびにスクロールビューアーの高さを設定するイベントと、ツリー ビュー アイテムが変更されるたびにカスケード UpdateLayouts() を開始するイベントを作成しようとしました。
ScrollViewer の高さを設定することが、すべてが期待どおりに機能する唯一の方法でした。