That's easy! TeX always does macro expansion, except when it doesn't.
On page 215, second double dangerous paragraph, we read
Expansion is suppressed at the following times:
- When tokens are being deleted during error recovery (see
Chapter 6).
- When tokens are being skipped because conditional text is being
ignored.
- When TeX is reading the arguments of a macro.
- When TeX is reading a control sequence to be defined by
\let, \futurelet, \def, \gdef, \edef, \xdef, \chardef,
\mathchardef, \countdef, \dimendef, \skipdef, \muskipdef,
\toksdef, \read, and \font.
- When TeX is reading argument tokens for
\expandafter,
\noexpand, \string, \meaning, \let, \futurelet, \ifx,
\show, \afterassignment, \aftergroup.
- When TeX is absorbing the parameter text of a
\def, \gdef,
\edef, or \xdef.
- When TeX is absorbing the replacement text of a
\def or
\gdef or \read; or the text of a token variable like \everypar
or \toks0; or the token list for \uppercase or \lowercase or
\write. (The token list for \write will be expanded later, when it
is actually output to a file.)
- When TeX is reading the preamble of an alignment, except after
a token for the primitive command
\span or when reading the
after \tabskip.
- Just after a token such as
$3 that begins math mode, to see if another token of category 3 follows.
- Just after a
`12 token that begins an alphabetic constant.
Not unreasonable, is it? When doing definitions, we want that nothing is expanded (except for \edef and \xdef) and the fourth, fifth, sixth and seventh bullets deal with this. Similarly if we want to store a token list in a register or in \write.
Similarly, the token after \expandafter, \noexpand, \afterassignment or \aftergroup must not be expanded for obvious reasons; it will later, when TeX examines it again at the appropriate time.
The last bullet has a technical reason: If you want to refer to an alphabetic constant that corresponds to a character with \catcode 0, 5, 9, 13, 14, or 15 it can be “escaped” with a backslash in front of it, but this actually doesn't form a control sequence. So you can do `\^^M if you want to refer to the constant 13 or do \chardef\%=`\%.
The second bullet can be supplemented by an important remark: notwithstanding that TeX does no expansion when skipping conditional text, it does examine the tokens in order to match conditionals with their \else or \fi. Any token that is \let to a primitive conditional, to \else or \fi counts under this respect.