No he revisado a fondo, pero desde el principio:
Código Delphi
[-]
begin
New(pDato);
pDato := @Dato;
Dato.Path := Principal.LabEdit1.text;
Dato.Size := 2048;
Thread.MsgWaitFor(ThreadExample, pDato);
end;
algo parece ir mal. Tú asignas memoria a pDato con la llamada a New, pero luego redireccionas pDato a la variable Dato que no ha sido inicializada y usas esta variable como si nada. Es lógico que te aparezca un "Access Violation".
// Saludos