First note that your function cannot be called by reference because of the way it's declared.
function myfunc(a: string); overload;
You would have to change this to:
function myfunc(var a: string); overload;
But if you want to call the same function, you need to call the function with a discard variable that is a copy of the input.
b := 'cde';
discard := b;
myfunc(discard);
caption := b; //uses 'cde'
However you can create a second function that trivially wraps the first for you and discards the by ref change:
function myfunc2(s: string);
begin
Result := myfunc(s);
end;
//Now the earlier code becomes:
b := 'cde';
myfunc2(b);
caption := b; //uses 'cde'
Note, that unlike Remy's answer this uses a different function name and not an overload, because the compiler would be unable to detect which of the 2 functions to call. However, I would strongly argue that this is a good thing. One of the worst things you can do for the maintainability of your program is write identically named functions that are fundamentally different. It makes it very confusing to figure out what is happening on a particular line of code.