Found the problem. It wasn’t a problem with Event Receive Abort.
In my BTT_MoveToRange, I was handling the OnFail pin from AIMoveTo. If this happened, I was calling FinishExecute with Success==false. It just so happens AIMoveTo will fail for many reasons, not all of them catastraphic, namely the Skipped result. On some EventReceiveTick events, it would pump my AIMoveTo node, and fail with Skipped. This would call FinishExecute with Success=false, and remove the node from relevancy. This would then end the BT selector node called Range. Then BTT_AttackNearestEnemy would activate. So, the reason Event Receive Abort never fired was because FinishExecute was called before it had a chance. The fix was to not call FinishExecute unless it was a real failure other than Skipped.
Lesson: If your EventReceiveAbort isn’t firing, it’s because you’re calling FinishExecute.