Apparently iMovie converts 30 fps to 29.97, per your findings.
I recorded a video on my iPhone at 30 fps setting. QuickTimePlayer movie inspector showed it at 29.98. When I imported it into an newly created iMovie project, it showed at 30 fps, or at least the frame counter clicked from 00:29 frames to 01:00 (1 minute) on the next click. So that indicated 30 frames in one minute. Don't know how accurate the frame counter is, as we are dealing with very tiny rate differences. So can't be sure whether iMovie may have converted the clip to 29.97 fps on import. Your findings would suggest yes.
I exported the movie and QuickTimePlayer movie inspector showed it at 29.97 fps.
So, there may be some inaccuracies in the frame rate measurements. My 30 fps iPhone video exported at 29.97 fps. However, your real time measurement shows 29.97 fps, so that would be the proof, at least as to the export frame rate. I'm not sure whether iMovie made the conversion of the original clip upon import into iMovie or upon export. Your findings would indicate that it was converted on import. To answer your question, I don't know how to keep that from happening. Did you try using the Speed Editor to make an adjustment per my earlier suggestion? Either speed up the video or slow the audio? If so, did that work to bring the clips in sync?
Another thing you can try is to export your video clip and use Handbrake to convert the 29.97 fps rate to 30 fps, and then import the converted clip into your project. See if that makes a difference. You can get Handbrake here:
https://handbrake.fr/
-- Rich