When hiding and showing elements in AMP based on amp:access, it seems like some flicker is unavoidable. Beyond placeholders and putting things below the fold, are there any other ways to make this better? Maybe it makes sense to actually hide the entire body until the request returns?
Hiding body completely will be very unideal because latency of authorization response can vary greatly. It's instead recommended to show as much as possible and only hide things when the authorization response returns. So, you are correct, keeping things unchanged above the fold is the best strategy.
In practice, the flicker effects can also a bit more subdued via: 1. Pre-rendering. Major apps using AMP, such as Google Search, pre-render articles and thus execute authorization response earlier - potentially way before the user actually reads the content. This is not in the page author's control, but something to keep in mind. 2. The authorization response can be cached, especially for subscribers. This would lead to a much earlier evaluation.
Another thing that may help in the future - AMP is considering adding an a amp-access-hide=elide
option. You can track it via https://github.com/ampproject/amphtml/issues/2967. The idea behind it is to show obscured (unreadable) content when restricted. This would reduce the flicker because it'd simply remove blurring instead of showing the whole sections. This is still an item under discussion.
Also, some compromise is possible where AMP would wait for a very limited time before showing content in hopes that authorization response arrives quickly (feel free to file a bug on GitHub), but it'd be very limited.