You've picked an unfortunate example, as it's more easily achieved with:
let myvar .= 'bar'
Still, for more complicated edits, you could use the following commands:
Insert the variable into the buffer:
o<C-R>=myvar<CR>
N.B. In the above, <C-R> denotes a press of Ctrl-R, and <CR> is a press of Return.
Perform your edits.
Reassign the contents of the line to the variable and delete the line:
:let myvar = getline('.') | d
Steps 1 & 3 can be converted into mappings:
:nnoremap <expr> <leader>ev "o\<C-R>=" . input('Variable: ', 'myvar', 'var') . "\<CR>"
:nnoremap <expr> <leader>av ':let ' . input('Variable: ', 'myvar', 'var') . " = getline('.') <bar> d\<CR>"
These prompt the user for which variable they want to edit/assign to, offering a default of myvar, and using variable completion so you don't have to type out the whole variable name.
If you always want to edit myvar, you can just replace the call to input() with myvar. If you only want to be asked in the first mapping, then you could save the name of the variable selected in a variable and use that in the second mapping: at that point you'd probably be better off using a mapping that calls a function instead of attempting to cram it into a one-liner.
Creating a more polished, complete solution as described in the question is left as an exercise to the reader. You'd probably want to set up a function to create the new buffer and insert the contents of the variable, and a BufWriteCmd autocommand to intercept the saving of that buffer (and only that buffer) and instead reassign to the variable.
Further reading:
:help i_CTRL-R_=
:help getline()
:help :d
:help :map-expr
:help input()
:help :command-completion
:help :function
:help autocommand
:help Cmd-event