The solution to my problem was to add the _addCanvas as a child of canvas after I had called canvas.Measure and canvas.Arrange.
I'm not 100% on why this was necessary, but here is why I think this worked: While debugging, I noticed that the canvas.ActualWidth and canvas.ActualHeight are zero before the calls to measure and arrange. I guess that in this scenario (having a Canvas that's a child of a Canvas), the RenderTransformOrigin for _addCanvas was being set relative to canvas. Since the ActualWidth and ActualHeight of canvas were both zero when I put _addCanvas in its list of children, _addCanvas was getting rotated about the origin, instead of about its center.
If you insert _addCanvas into the list of children after canvas has been measured and arranged, canvas will have non-zero values for ActualWidth and ActualHeight, and _addCanvas will be rotated about its center as desired.