React NativeのアプリにはJS層とNative層があり、ビルドは別々に行われます。基本的にネイティブでビルドするときには最新のJS bundleに変更したいはずなので、同時にjs bundleも行われます。

iOS

iOSではあらかじめXcodeのBuild Phaseに組み込まれているため、リリースビルドする際には自動的にmain.jsbundleというファイルが事前に作られた上で、これを同梱する形でビルドが行われます。

Xcodeで指定しているシェルスクリプト、node_modules/react-native/scripts/react-native-xcode.shを見るとreact-nativeのCLIコマンドでjsbundleを作っていることがわかります。

Android

androidの場合はnode_modules/react-native/react.gradleにコマンド呼び出しの記載があります。

def currentBundleTask = tasks.create(
        name: bundleJsAndAssetsTaskName,
        type: Exec) {
  // 略
  commandLine(*nodeExecutableAndArgs, cliPath, "bundle", "--platform", "android", "--dev", "${devEnabled}", "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs)

  enabled config."bundleIn${targetName}" || config."bundleIn${buildTypeName.capitalize()}" ?: targetName.toLowerCase().contains("release")
}

app/build.gradle側の設定もしくはreleaseビルドの際にbundleが作られるようです。

という、ビルド周りのコードをちょっと読んだよという話でした。