How I solved it:
Looked at the network console in my Chrome, and looked at the responses of /appScreenshotSets api calls. It will make a call each time you switch locale. Inspect each of them. For each, there will be list of screenshots, and look for the one that does not say "state": "COMPLETED". Look at other information there, and you will be able to figure out which screenshot it is (for example, your original filename will also be there). Delete and reupload that (way few seconds after upload before you navigate away).
In my case one of the screenshot said "UPLOAD_COMPLETED" instead of "COMPLETED". Reuploaded that, and it app review went through.
If you want to narrow your search, look at the response of the api call that is made when you click "Add to review", it will give you a uuid for the exact screenshot(s) that failed. Now search for that in the appScreenshotSets api responses.
Cause of this (For the apple engineers):
You guys have designed screenshot upload to be a 2 step client driven process. Essentially, client first uploads an image, and then later has to make another API call to PUT an image somewhere, but the UI already shows success after the first step itself, and user navigates away, essentially failing the 2nd call.
Either make the second call a server side step, or make the UI show upload success only after both steps are done.