tried to factor out .subst($what, :$for) - and getting quite a bit "less than awesome" error msg:

Method 'alpha-needy-terms' must be implemented by Term because it is required by a role
  in any compose_method_table at src/gen/m-Metamodel.nqp:2362
  in any apply at src/gen/m-Metamodel.nqp:2372
  in any compose at src/gen/m-Metamodel.nqp:2518
  in any make_pun at src/gen/m-Metamodel.nqp:1436
  in any find_method at src/gen/m-Metamodel.nqp:1459
  in method message at src/gen/m-CORE.setting:13194
  in method subst at lib\Lambda\Substitution.pm6:7
  in block <unit> at E:\proj\perl6\Lambda\t\Substitution.t:14
another "less than awesome" error msg, yielded by "correct" usage of .subst:

No such method 'item' for invocant of type 'Term'
  in method message at src/gen/m-CORE.setting:13203
  in any return_error at src/vm/moar/Perl6/Ops.nqp:646
  in method subst at lib\Lambda\Substitution.pm6:7
  in block <unit> at E:\proj\perl6\Lambda\t\Substitution.t:14
seems I've found the problem: cannot declare return type Term in .subst (!?!); also: fixed bug in case AppT (caused infinite regress)