Try removing the static keyword from static int rb_down = No; and the equivalent in your lb function.
Looks to me like it gets the touches regardless of whether any are down or not, so 'if (touches)' is always true which prevents the alternative 'else rb_down = No' from executing. If the touch is outside the radius the subsequent setting of rb_down to Yes is missed. While that wouldn't matter (given it sets to Yes', the point is that nothing is setting it to anything in that circumstance...and thus it will remain as 'Yes' from when the touch was within radius.
The problem is that there is basically nothing that sets this to 'No' after the first initialization to that with the static keyword. Once it goes to yes, it stays yes...unless you lift all fingers up, in which case your 'if( touch_count != 0 )' triggered ZeroMemory call does the work, or you lift the finger in question (triggering touchesEnded, which will also do it).