It's because the constraints are so different. Deploying to prod is incredibly expensive in this case and you practically cannot iterate outside prod either.
I see this every day in the difference between SaaS and on-prem Enterprise software. If you have a bug in on-prem, Enterprise every customer needs to deploy the patch. You need to update all affected, supported versions, etc. In SaaS, you just deploy and more often than not that's it. This changes the way you do everything and it comes with a high cost. JWST is the most extreme example on this spectrum.
I helped run a world-class MySQL installation for one of the world's largest tech firms. The install was the most mission critical system at the entire company and downtime was extremely expensive.
I was hired because during failovers, the engineers were often getting unhandled runtime exceptions in the failover python code. (much of it was untested except when running failover) Often, the engineers would break one thing while cleaning up another thing. All of this was OK, because the system failed infrequently enough and was eventually replaced with spanner.
I see this every day in the difference between SaaS and on-prem Enterprise software. If you have a bug in on-prem, Enterprise every customer needs to deploy the patch. You need to update all affected, supported versions, etc. In SaaS, you just deploy and more often than not that's it. This changes the way you do everything and it comes with a high cost. JWST is the most extreme example on this spectrum.