Hm, odd subject line. If it's getting a 500 response it cannot be said to be "working" ;) Where are you seeing the 500 response, if it's neither in logs nor in the visible page?
RewriteCond %{REQUEST_URI} [^/]$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /subdir/$1 [L]
What's this for? I smell a CMS, but why not put the first condition into the body of the rule?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+[^/])$ /subdir/$1 [L]
Since the rule by definition isn't intended to apply to requests for the root (which has to be considered a / directory), it should in any case say + rather than *.
Are there a great many URLs that fit this pattern? ("It doesn't exist at its originally requested location, so send them over to /subdir/".) If not, it would be better to list them by name.
A further problem is that the root is either
^$
or
/
or
/somedir/otherdir/hostname/
depending on where you're looking. Are these rules located in htaccess, or loose in the config file?
:: detour to check something ::
Ah. The label %{REQUEST_FILENAME} is misleading; it doesn't actually mean filename (like a <Files> envelope) but the full path. What happens if the file also doesn't exist in /subdir/ ? Don't you get an infinite loop ending in a 500?
Finally, it seems as if the first rule should be constrained to requests for pages, unless you've done a major rearrangement and you also need to redirect search engines. (Nobody else would make a "cold" request for an image.) Is there a consistent extension, or are you extensionless? Does a . period ever occur in a filepath anywhere other than right in front of the extension?