When updating products via CSV import, you only need to import ones which have changes or are new. So if you have a product catalog of say 40,000 but since last import, only 500 have changed and 100 have been added, you simply import 600 which is well within the performance window for CVS imports.

If you have much larger update quantities, simply batch them, break up the imports in smaller chunks.

If you do not want to do any of above manually (there is no API for bulk CSV import / export) then you need to resort to custom importer via API which will be much slower due to throttling.

If the constraints above are good enough, then you may still need much larger inventory updates across the entire catalog and if you run in to performance issues with CSV import for inventory, then you can use the GraphQL Admin API which has inventoryBulkAdjustQuantityAtLocation that has a very low cost on your API usage and may perform better / more reliable for inventory level updates.

I'd go for 2 and 3. Option 2 for product updates. Option 3 for inventory updates because it will be much faster than using the REST Admin API (which would be separate calls since product and inventory are separate).