You can see this all in the manifest (e.g.,
shell-app-manifest.json). There’s a revision ID (a unique, non-sequential code), publishedTime, SDK version, etc. So, publish is doing its own incrementing so your users will get the newest JS their app download’s SDK version supports.
You wouldn’t want publish to increment your versionCode. That’s a sequential number for identifying unique app builds for the app stores. You could have many publishes for a single build in the case of publishing OTA updates after publishing an app on the store. You wouldn’t see the versionCode increment after a publish because publishing does not update the app binary on your device. It just updates the JS downloaded in that binary’s data and run when you start the app.
In the case of ExpoKit, even building a new app after changing versionCode in app.json does not change the actual version code, as that number is copied over to your Android/ iOS projects as a one-time-only thing when ejecting.