avior trees, and one of the common recommendations I've seen is to maintain a reference to your running action so that you don't have to traverse the entire tree during every game loop.  Without traversing the entire tree every time, how do I check if an action should end early?
For example, suppose I have the following tree and the AI encounters an enemy that's closer than 10m, so he starts to aim his weapon.  But then while he's aiming, his HP drops below 50%.  I would want the agent to stop the aiming/firing sequence and move to the "use medkit" action.  

The only way that I can think of to accomplish that sort of behavior is to evaluate every node in the active branch -- starting from the root node -- during every game loop.  But based on what I've read, evaluating the entire active branch every game loop is discouraged.
Is there a way to be able to abort an action if a higher-level node is no longer valid, while not spending a lot of processing power evaluating the entire branch every game loop?

A:

That is not how you do do decisions in a behavior tree.
If I understand correctly, your tree has this logic:
while(true)
{
    if (HP > 50%)
    {
        if (Visible enemy closer than 10m)
        {
            Aim Weapon
            Fire Weapon
        }
        else
        {
            Move
        }
    }
    else
    {
        Use Medkit
    }
}

This is how you should express it:
selector
{
    sequence
    {   
        HP > 50%
        selector
        {
            sequence
            {
                Visible enemy closer than 10m
                Aim Weapon
                Fire Weapon
            }
            Move
        }
    }
    Use Medkit
}

Let go over it, starting from the most inner part:
            sequence
            {
                Visible enemy closer than 10m
                Aim Weapon
                Fire Weapon
            }

This is a sequence, it will succeed if all its tasks succeed. Fail as soon as one fails. That means that if Visible enemy closer than 10m fails, you don't 