Das ist in Ordnung: GetUnicode() erstellt lokal erst einmal in TEncoding und legt es in LEncoding ab. Dann schaut er ob TEncoding.Unicode (class var FUnicodeEncoding) schon belegt ist. Wenn ja dann sagt er "Ok, dann halt nicht" und gibt sein LEncoding direkt wieder frei. Wenn nicht, dann schreibt er in class var FUnicodeEncoding die Referenz auf LEncoding.
So viel zum Thema Delphi sei immer super lesbar
Der Klassendestruktor von TEncoding ruft FreeEncodings() auf, das gibt am Programmende auch das TEncoding.Unicode wieder frei.