\test の定義部を次のようにすればうまくいくでしょう.
\bgroup
\catcode`\{=10
\catcode`\}=10
\catcode`\<=1
\catcode`\>=2
\gdef\test<%
\xdef\temp<expandafter{ }>
>
\egroup
文字のカテゴリコードは,TeX エンジンがファイルからその文字を読み取った時点での設定が適用されます.
つまり,
\def\test{%
\bgroup
\catcode`\{=10
\catcode`\}=10
\catcode`\<=1
\catcode`\>=2
\xdef\temp<expandafter{ }>
\egroup
}
の場合,これを「読み取った時点での」 < や > のカテゴリコードは
12ですので,そのように \test は定義されます.
その後 \test の展開で \catcode`\<=1 が実行されようが,
既に12になっている < のカテゴリコードが変わることはありません.