There are two distinct cases here, one must involve a copy, and the second must involve pointers.
In the case you are mentioning a copy is made. You can test this like so:
create function test_test(inout test test) returns test as
$$
begin
$1.test := $1.test + 1;
return;
end;
$$ language plpgsql;
select (test_test(t)).test, (test_test(t)).test from test t;
where test.test is an integer. The numbers will be the same.
The second is in triggers, where modifying NEW will be passed to the next trigger. These must be passed by reference.