As far as I understand the concept there is no true pass-by-reference in Mathematica. Attempting to make assignments to arguments is in fact a common mistake which I addressed in this answer: Attempting to make an assignment to the argument of a function. As described there one needs a Hold attribute for in-place modification of definitions, e.g.:
SetAttributes[foo, HoldFirst]
foo[bar_, new_] := bar = {bar, new};
x = {1};
foo[x, 2];
x
{{1}, 2}
This requires passing a Symbol name which is not a type that is supported by Compile.
One can nevertheless make assignments to Symbols (through a callback to the main evaluator):
cf = Compile[{{mat1, _Real, 3}}, x = mat1; 1];
cf[{{{2}, {8}}}];
x
{{{2.}, {8.}}}
Since this is a main evaluator callback the assignment function exists verbatim in cf:
Cases[cf, _Function, -1, 1]
{Function[{mat1}, x = mat1]}
This means that you can actually replace that Symbol with a different one, e.g.:
(cf /. HoldPattern[x] :> q)[{{{4, 5, 6}}}]
q
x
{{{4., 5., 6.}}}
{{{2.}, {8.}}}
Note that x was not modified. This illustrates that you can write hybrid functions that are partially compiled and yet have assignments to passed-in Symbols. Whether or not this prove to be useful in practice remains to be seen. If this does seem to be what you are looking for I can develop this further.