Kurz: Sorgt dafür, dass sich außerhalb der Funktion die übergebene Variable nicht ändert und bleibt dennoch performant und Speicherfreundlich.
Also ist (etwas provokant gesagt) der Sinn dahinter, der Schutz vor eigener Dummheit. Denn wenn ich die Variable an eine Funktion z.B. nur ByRef übergebe, liegt es doch an mir aufzupassen, dass ich sie nicht versehentlich manipuliere, wenn das nicht gewollt ist.
Einen programmtechnischen Vorteil (ausser dem vorgenannten Aspekt) bietet es also nicht.