I'm having this problem in 2025. I found a solution. I'm not sure if this applies to OP or anyone else here, but just in case, here was my solution.
I'm using an Animator and I'm swapping the runtimeAnimatorController to play different animations. I have a Coroutine that detects when the animation has ended and handles it differently based on certain contexts. For some reason, this one animation was just looping instead of its end being properly detected by my Coroutine.
To fix this, I opened the AnimatorController in question, selected the animation in question, and changed its "Exit Time" to greater than 1.0. It couldn't detect when "normalizedTime" was greater than 1.0 because it never was!