The shell cut's your command line into pieces.
In the first example:
1. why
2. are
3. ...
6. lazy?
So it "thinks" you want it to execute the "why" command with paramaters "are", "you", "so", "damned", plus whatever "lazy?" expands to in your current directory. It cannot find any files starting with "lazy" followed by exactly one character, so it says "I cannot execute the 'why' command on your behalf because that wildcard pattern does not match".
Second example:
1. "why are you so damned lazy?" as a single string.
Again it looks for something matching "why are you so damned lazy" including the spaces and followed by exactly a single character. Then it complains that it cannot execute the "why are you so damned lazy?" command, because again - "no match". If you would create a file named "why are you so damned lazyX" in your current directory, the expansion would succeed, but it would error out with "command not found", because the current directory is not in the command search path.
The fundamental principle is that the command line is first completely cut into tokens and all wildcards expanded - and then the shell tries to execute whatever is the first token. In the first case "why", in the second case "why are you so damned lazyX", if that file is present. If it isn't, the expansion fails, so it does not even try to execute anything.
The final command in Unix never sees the original command line. It get's a neat array of preprocessed single arguments.
If you have files
aa
ab
ac
and you type ls a*
, /bin/ls never sees "a*" It gets three separate arguments, "aa", "ab", and "ac", respectively.
That's the reason why something like mv *.txt *.bak
, which works fine in MS-DOS, can never work in Unix. If you have
a.txt
b.txt
and execute mv *.txt *.bak
, the shell turns this into mv a.txt b.txt *.bak
- provided there are no ".bak" files anywhere - and then rightfully complains that that does not make sense and again aborts with "no match".