I don’t know if anybody has hit the cap or if it’s strongly enforced. It is my understanding though that when a url for an image is removed from the sheet, it’s supposed to be deleted from storage within 30 days. Again, not sure how well that’s enforced yet.
I’m sure you could find or write a process or a script to take the existing urls, process through them to download and then upload to S3. Then take the resulting URL and update the sheet. Probably a bit of an undertaking, but most likely possible.
The alternative would be to have the users directly upload to S3 through a third party site in a webview, and through some magic, possibly through zapier or integromat, have the urls for the uploaded images inserted into the sheet. @Krivo has some write-ups on the work he has done to try to accomplish this by uploading externally to Cloudinary.