Ваша ошибка в том, что вы используете не тот список. Вы используете TList, который не удаляет свои элементы в момент разрушения списка. Поэтому ваша утечка - это не распущенные экземпляры TSurvey. Вместо этого нужно использовать TObjectList, который при установке ownsObjects = True, удаляем свои элементы.
Итого, код создания списка должен быть таким:
function GetList: IList<TSurvey>;
var
list : IList<TSurvey>;
i : Integer;
item : TSurvey;
begin
list := TCollections.CreateObjectList<TSurvey>(True); // <-- !!!
for i := 0 to 10 do
begin
item := TSurvey.Create ();
item.Id := Random(100);
item.Name := I.ToString;
list.Add ( item );
end;
Result := list;
end;
Можно поиграться с проектом в Windows MemoryLeak.zip