The RewriteRule applies upfront to all requests, internal and external, with or without slash or extension, so request gets bumped up to Condition. Condition evaluates request:
Is there such a file as
Nope, we can skip this rule.
This step happens for every single image and stylesheet and external .js file and supplementary php file and requests for robots.txt and sitemap.xml and ... well, you get the idea.
Never use [NC] when you will be capturing and reusing. Depending on your server, you will end up with either Duplicate Content or a 404.
To be safe, you should redirect both .shtml and .php extensions. This will protect you against type-ins and against any links that you put up before you decided to go extensionless-- as well as against Senior Moments. ("Why do I keep getting these ### requests for directory/index.html? Oh. Because in one place on one page I absent-mindedly linked to it.") You can shove it all into a single Rule-plus-Condition:
(I put in the space-plus-HTTP part to ensure that the extension came at the end of the request, as in the Rule. Note that literal spaces always have to be escaped in mod_rewrite, since a space by itself has syntactic meaning.)
If you don't include the full protocol and domain in each Redirect target, mod_rewrite will use whatever form came with the request. If it was the wrong form, the user will then get redirected twice. This creates extra work for the server and annoys search engines.