One more update- I was able to work around this for now just by tossing an assumeIsolated into the completion handler. Hopefully, Apple will eventually annotate all of these completion handlers as explicitly @MainActor, now that the Swift language has evolved and the completion handler isn't implicitly MainActor like it used to be.
I'm still not sure how one would use the async version of this API, though. It either should have had its closure marked as @MainActor but didn't, or if it DOES need to be nonisolated (because it runs on a thread), that means for animating view properties we have to use the callback version of this API.
Here is my final, working (for now) code. I hope Apple annotates these completion closures better so the original code continues to work.
NSAnimationContext.runAnimationGroup({(context) -> Void in
context.duration = animated ? 0.5 : 0
clipView.animator().setBoundsOrigin(p)
}, completionHandler: {
MainActor.assumeIsolated {
self.endIgnoreFrameChangeEvents()
}
})