Since you made the index filtered, SQL Server can only use the index if the conditions align with the index. But all you have is:
WHERE external_system = @p0
AND external_docid = @p1
Since SQL Server are compiling the query to put in the cache, it must select a plan that works for any value of @p0 and @p1, including the empty string and NULL.
There are two remedies. One is, as you have discovered, OPTION (RECOMPILE). And you are right, this is not the best solution. If nothing else, the query will blow up again, if you pass @p0 or @p1 as empty string or NULL.
The other solution is to add the conditions from the index to the query:
WHERE external_system = @p0
AND external_docid = @p1
AND external_system <> ''
AND external_system IS NOT NULL
AND external_docid <> ''
AND external_docid IS NOT NULL
Or you can just raise the white flag and make the index unfiltered...