Exactly—don’t copy current_player_health_percent into prev_health_percent at the same time you start the flash. That’s what makes them match every tick and kills the < check.
Keep the “start flash” block guarded by timer = 0 (so it only runs once per hit), but leave the prev_health_percent update in the second IF that fires when the timer actually reaches zero. That way prev still holds the pre-damage value while the flash is running, and only gets synced to the new health after the countdown finishes.
So your action script should look like this:
▶ IF (Is Number: {"placeholder":"getvariable","values":{"name":"health_flash_timer"}} = 0)
└─ IF (Is Number: {"placeholder":"current_player_health_percent"} < {"placeholder":"getvariable","values":{"name":"prev_health_percent"}})
└─ Set Variable Value: health_flash_timer:10
└─ Set Variable Value: health_flash_alpha:1
▶ IF (Is Number: {"placeholder":"getvariable","values":{"name":"health_flash_timer"}} = 0)
└─ Set Variable Value: prev_health_percent:{"placeholder":"current_player_health_percent"}
▶ Set Variable Value: health_flash_timer:{"placeholder":"maxnum","values":{"first":"0","second":"{"placeholder":"calc","values":{"decimal":"true","expression":"{"placeholder":"getvariable","values":{"name":"health_flash_timer"}} - 1"}}"}}
▶ Set Variable Value: health_flash_alpha:{"placeholder":"calc","values":{"decimal":"true","expression":"{"placeholder":"getvariable","values":{"name":"health_flash_timer"}} / 10"}}
Notice prev_health_percent is still only updated in the second IF after the timer hits zero, so the / < check keeps seeing the old health until the flash finishes.