Man kann die Definition eines Makros in TeX mit `\show` oder mit `\meaning` abfragen. `\show` schreibt dabei immer in das Terminal und die log-Datei, taugt für Deinen Zweck also nicht. In der Ausgabe von `\meaning` wird als escape character immer das in `\escapechar` gespeicherte Zeichen verwenden, unabhängig davon, wie ein Befehl tatsächlich definiert wurde. Beispiel:
\escapechar=91
\message{\meaning\bf}
führt zur Ausgabe: `macro:->[fam [bffam [tenbf`. Das wäre jetzt noch kein Beinbruch. Man könnte ja dafür sorgen, dass `\escapgechar` auch wirklich 92 ist, bevor man die Ausgabe weiterverarbeitet. Aber: War es für die Definition eines Makros notwendig, statt `\` beispielsweise `|` als escape char zu definieren wie in Deinem Beispielcode für die Definition von `\ttfinish`, dann wird trotzdem nicht so angezeigt:
\message{\meaing\ttfinish}
wird also angezeigt als: `macro:#1^^M#2\endtt->#1\vbox {#2}\endgroup $$`
Selbst, wenn man die Ausgabe irgendwie zerlegt, etwa mit
\gdef\parsemacro#1:#2->#3<-{\def\isarg{#2}\def\isdef{#3}}
\expandafter\parsemacro\meaning\ttfinish<-%
\message{\string\def\string\ttfinish\isarg{\isdef}}
wird man nicht mehr die ursprüngliche Definition erhalten, sondern `\def\ttfinish#1^^M#2\endtt{#1\vbox {#2}\endgroup $$}`. Das entspricht zwar der Bedeutung aber nicht der Definition.
Hinweis: Statt mit `\message` auf die Terminal zu schreiben, kann man natürlich auch immer mit `\write` in eine andere Datei schreiben und erhält dabei genau das gleiche Ergebnis.
Bei Verwendung von [e-TeX](http://www.ctan.org/pkg/etex) (auch [e-TeX](http://www.ctan.org/pkg/etex), das für plainTeX i. d. R. als `etex` oder auch als `pdfetex` möglich) oder auch `pdftex` verfügbar ist, gibt es weitere Möglichkeiten mit `\detokenize` oder `\unexpanded`, die aber alle ebenfalls das `\escapechar`-Problem besitzen dürften.
Übrigens: Wenn man bei `\meaning` den Teil vor dem Doppelpunkt in `#1macro#2` aufteilen will, um `\long` definierte Makros zu erkennen, dann hat man bei der Definition das Problem, dass `\meaning` Token der Kategorie *other* liefert. Daher funktioniert ein einfaches
\gdef\parsemacro#1macro:#2->#3<-{\def\islong{#1}\def\isarg{#2}\def\isdef{#3}}
höchstwahrscheinlich nicht. Man bräuchte das `macro` nach `#1` ebenfalls mit `\catcode` *other* für `m`, `a`, `c`, `r` und `o`. Das sei nur der Vollständigkeit halber erwähnt.