I am not sure to understand either why it returns an empty list. Perhaps when using strings as list elements in Position, one should use a different pattern construction. But I am not sure why this would be the case, so I do not know. I would be interested if anyone has an idea.
Here is a way that seems to solve the issue. It is not very nice but it works fine:
I don’t think Heads->False is needed because Position acts on lists. StringMatchQ will return an error if any element in the list myStrings is not a string. I have been using the following, which works on lists and lists of lists that may also contain data types other than strings.
The only problem is that the test _String? can slow it down considerably if used repeatedly. I suppose another way to do it would be to convert all of the elements of myStrings to strings using ToString as a precaution.