Thanks -- your code worked for me, so I was able to work backwards from there to find the problem. My View menu contains an item that opens my app's Settings window. But the default Application menu opens the iOS Settings app, which isn't very useful to users, so I had also overridden that menu to open my app's Settings window. It turns out a menu won't display if it contains an action that's already in another menu.
And now I see a warning about this in the Xcode console, which I hadn't noticed before. 🙄
It was still working in Mac Catalyst because the default Application menu there is more useful and I wasn't overriding it, so I wasn't creating a duplicate.
I simply made a second function that opens my app's Settings window, and used one in the Application menu and the other in the View menu, and now it's working.