It shouldn't work, though. This is just straight up undefined behavior, since the TMemo.Lines property does not point at a TStringList object, it points at a TMemoStrings object instead. And TSStringList overrides Add() whereas TMemoStrings does not, so even the vtable contents are different.
Don't write code like this. The correct solution is to make FillStrings() take a TStrings instead:
function FillStrings(aStrings: TStrings): boolean;
begin
aStrings.Add('a');
aStrings.Add('b');
end;
...
FillStrings(Memo1.Lines);
Correct, because FillStrings() expects a TStringList specifically, not a TStrings generally.
Nope.
Nope.