That's the problem with (.*):
The use of "lazy regex," specifically the :kaioken: EVERYTHING :kaioken: atom, (.*), and its close relatives, is the NUMBER ONE coding error of newbies BECAUSE it is "greedy." Unless you provide an "exit" from your redirection, you will ALWAYS end up in a loop![/rant #1]
Okay, !-f should take care of your problems although I prefer to use my mod_rewrite to screen requests (you had EVERYTHING/NOTHING redirected to index.php). Don't you just want all .php scripts other than index being redirected (leaving images, css and js alone)?
Put yourself in the position of mod_rewrite and think about your redirectionS - mod_rewrite is restarted every time a match/redirection is successful so "get loopy" with mod_rewrite and you'll see the effect of bad code.