You would read directly from the file without the pipeline. This avoids running the while loop in a subshell, which allows you to see the changed value of $SOMEVALUE after the loop.
SOMEVAR="original value"
while IFS= read -r SINGLELINE
do
SOMEVAR="updated value"
printf 'this is a single line: %s\n' "$SINGLELINE"
printf 'SOMEVAR is now: %s\n' "$SOMEVAR"
done <"$SOMEFILE"
printf 'Final SOMEVAR is: %s\n' "$SOMEVAR"
If you insist on having your $MULTILINE variable, then write that to a file and read it from there:
tmpfile=$(mktemp)
printf '%s\n' "$MULTILINE" >"$tmpfile"
while ...; do
...
done <"$tmpfile"
rm "$tmpfile"
Also related:
An answer to the above linked question also suggests writing your program in such a way that all uses of $SOMEVAR occurs within the subshell at the end of the pipeline:
MULTILINE=$(cat "$SOMEFILE")
SOMEVAR="original value"
printf '%s\n' "$MULTILINE" | {
while IFS= read -r SINGLELINE
do
SOMEVAR="updated value"
printf 'this is a single line: %s\n' "$SINGLELINE"
printf 'SOMEVAR is now: %s\n' "$SOMEVAR"
done
printf 'Final SOMEVAR is: %s\n' "$SOMEVAR"
}
Also possibly related:
Other questions that may be of interest: