I think the problem is also that PWAs don't have any discoverability, and no standardization. I did some consulting work for a company that had a PWA. They had a 200-line long react component that was intended to determine what modal to show the user depending on what web browser and OS they were using to instruct them how to install PWA depending on the combination of OS and browser.
This is a lot of friction for the dev, and it's not clear to an average user what a PWA is. But they are familiar with, and for better or worse, trust, the App store. If I didn't know what a PWA and a site said "open menu and click on 'install!'" I'd be very wary of following those instructions!
I think Android and iOS should provide some sort of hook between the app store and PWAs before they really start to catch on.
The other thing is, many websites have bad or broken PWAs. It's usually just the website without tabs or back arrow, which sometimes makes navigation awkward because they built it assuming a browser. I'll always use the browser over the PWA.
I think once you've seen the actual possibilities of what e.g. an iOS app can do, when done correctly, everything changes for you.
My React-Native wrapper app handles native auth and native payments, so I occasionally need to tweak that, but it's rare.
I'm considering a rewrite in Capacitor so I can change those things without modifying the mobile app. It's not that releasing the mobile app is a big deal, but it's that it can take many weeks for users to update the mobile app, so I have to keep the website backwards compatible with the old mobile app. It makes testing new checkout flows and stuff more difficult.
I'm not 100% sure yet, but I might regret using React-Native over Capacitor. I have to bridge things like auth and payments between the web view and the native app. For example, the web app has a flow where you need to login, so it opens the login modal. If you're inside the mobile app, instead of doing that, it sends a message up to the native app to open the native app's login modal. Then once login is complete, the native app sends a message into the webview with the auth token. Similar thing for payments. That all works great, but occasionally I want to make a breaking change. Since it takes many weeks to get an update rolled out everyone, I have to keep the webapp backwards compatible for a long time. That slows down iterating on stuff like AB testing checkout flows. I don't think I'd have to worry about this if I was using Capacitor because the native functionality would be mostly driven from the webapp code.