This issue happens when Sequencer loops a dynamic montage. FAnimMontageInstance::ForcedNextFromPosition is set to 0 and ForcedNextToPosition is effectively the delta time. However, FMontageSubStepper::Advance only ever uses ForcedNextToPosition not ForcedNextFromPosition. This means that in FAnimMontageInstance::Advance, PreviousSubStepPosition always uses the position from the previous tick of the montage, not ForcedNextFromPosition. Therefore when we loop a dynamic montage, we end up with a PreviousSubStepPosition at the end of the animation, and Position at the start of the animation.
Various functions in Montages, like FAnimMontageInstance::HandleEvents assume that when Position < PreviousSubStepPosition that we're playing the animation backwards. Hence we sample all the notifies on the animation when looping. The same is true when sampling root motion.
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-298080 in the post.