Given only the code you have shown us, I would expect that you would actually have the LED flashing at a very high rate 25mSec after the last key press bounce. You certainly would not notice the flashing with your eye but you should see the toggling on a scope.
2mSec after that, no matter whether the key was still pressed or released, keyState would not be 0xf000 and so the toggling would stop until the next debounced key press. Whether it would stop toggling with the LED lit or not would be approximately 50/50 chance.
However, looking at the original code that you link to (I assume you have used the code in "Listing 2" on that page), the test that you have put into your 'main' function is actually in the function that they call from the ISR. Therefore that version is only tested every 2mSec and so would only return TRUE once per press.
I have implemented a software debounce like this (actually more like the version in Listing 3) but I also have a "previousState' value that mirrors the 'debouncedState' variable (along the lines of the code that Trent Cleghorn wrote in the link from the page you referenced) so that I can detect the transitions of any switch in either direction using an XOR of the two variables in my main function. As soon as a difference is detected, I copy the 'debouncedState' into the 'previousState' variable which stops the multiple detection problem.
If I were you, I'd put the test for equality to 0xf000 into the ISR and set another flag on the match. You can then test that flag in your main and reset it when you have toggled the led.
Susan