records declared as packed are indeed always packed to one, basically for file formats and transfer or space.
The local compiler directive {$packrecords X} behaves differently, e.g.
{$mode objfpc}
{$push}{$packrecords 2}
type
Tmyrecord1 = record //without packed
a:Byte;
b:dword;
end;
{$pop}
{$push}{$packrecords 4}
type
Tmyrecord2 = record //without packed
a:Byte;
b:dword;
end;
{$pop}
var
R1:TMyRecord1;
R2:TMyRecord2;
begin
writeln(SizeOf(R1)); // prints 6, alignment is 2
writeln(SizeOf(R2)); // prints 8, alignment is 4.
end.
If you would declare both records as packed, the result would be 5, which is efficient for transport and storage, but not efficient to compute on most platforms.
I hope this clarifies the issue and the difference.