I don't think that `StringMatchQ["x", Except[{"*"}]]` works as expected as well as `StringMatchQ["x", Except["*"]]`:

    StringMatchQ["x", Except[{"*"}]]
    StringMatchQ["x", Except["*"]]
    
>     True
    
>     True

The string pattern `"*"` is an *abbreviated string pattern* consisted from the only metacharacter `*` which corresponds to **zero or more characters** according to the first point under the "Details and Options" section of [`StringMatchQ`][1]. So by the definition the pattern `Except["*"]` shouldn't give a match at all because it means negation of literally everything. The current behavior is a bug.

This behavior is expected:

    StringMatchQ["x", {"*"}]
    StringMatchQ["x", "*"]
    
>     True
    
>     True

    StringMatchQ["x", {"\\*"}]
    StringMatchQ["x", "\\*"]    

>     False
>     
>     False

But the following is another bug:

    StringMatchQ["x", Except[{"\\*"}]]
    StringMatchQ["x", Except["\\*"]]

> StringExpression::invld: Element Except[{\\*}] is not a valid string or
> pattern element in Except[{\\*}]. >>
> 
>     StringMatchQ["x", Except[{"\\*"}]]
> 
> StringExpression::invld: Element Except[\\*] is not a valid string or
> pattern element in Except[\\*]. >>
> 
>     StringMatchQ["x", Except["\\*"]]

  [1]: http://reference.wolfram.com/language/ref/StringMatchQ.html