The general rule, which I expect you already know, is that with indirect speech, verb forms get shifted to their past form. Also you seem to know that "might" is the past form of "may" in contexts like unreal conditionals. So it makes sense that "might" would be the only correct choice in indirect speech as well.
However, this isn't true here for two reasons.
The first reason is that indirect speech doesn't require shifting verbs to their past form, so leaving it as "may" is acceptable. However, leaving it in the same tense can mean that the original thing stated is still true now.
The second reason is that "may/might" doesn't work the same in indirect speech as it does in unreal conditionals. It's correct and natural to use "may" in indirect speech about the past without implying it's still true now. Here's a context where the original speech clearly happened far in the past:
Lawyer: Did you speak to Ms. Walters on the evening of June 14, 2018?
Witness: Yes, I did.
Lawyer: What did she say?
Witness: I asked her why Simon wasn't there and she said that he may have missed his train.
Lawyer: What were her exact words?
Witness: Ms. Walters said, "He may have missed his train."
It's only "may" that behaves differently in indirect speech than in unreal conditionals. "Will" and "can" behave the same in both contexts and have to be changed to "would" and "could" when using indirect speech about things that are no longer true. I don't know why "may" is different in this respect, so hopefully someone else can add this in another answer.