Preallocating arrays is often a good practice, but you can still pass them as arguments β it doesnβt require you to use globals.
In any case, as @ericphanson pointed out above, a statement like Bβ = B * M or πβ = [Hermitian(M'*D*M) for D β π] allocates new arrays anyway β you are βrebindingβ the variables Bβ and πβ to βpointβ to new arrays in memory, not mutating them in-place. See also this discussion.
(This is not unique to Julia! If you do a = [3,4,5], then b = a, followed by a = [4,5,6] in Python or Matlab or most other languages with analogous operations, b will still be [3,4,5].)