Yes and no: you do not need a function for that:
program recordpackingagain;
{$mode objfpc}
type
TRec = bitpacked record
CArr1: array [0..15] of Byte;
CArr2: array [0..15] of Byte;
CArr3: array [0..15] of AnsiChar;
end;
const
func:TRec = (
Carr1:(0,1,2,3,4,5,6,7,8,9,$A,$B,$C,$D,$E,$F);
Carr2:(0,1,2,3,4,5,6,7,8,9,$A,$B,$C,$D,$E,$F);
CArr3:('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
);
begin
end.
This is guaranteed to be aligned.
Even if {$writeable const}/{$J+} is on.
If you subsequently use a global const of that record, all fields will always have the same address too.
Using a function is wrong because that aligns on the stack and can have different pointers on every call. (Although in practice these consts are global)