I tried making this a comment but there's just too much to say and some of it needs formatting:
@adam you seem to have some fundamental misunderstanding of awk that's making it hard for you to grasp what you're being told. I suspect it comes down to this - awk is not shell. Awk is a completely separate tool/language with it's own scope, variables, functions, etc.
Do NOT try to access the value of shell variables directly within an awk script by using intermediate single quotes (e.g. awk '{print $1'"$i"'$2}') because that will turn the value of the shell variable into part of the awk code before the interpreter reads it and open you up to horrendous errors with cryptic error messages (or worse - insidious bugs with no error messages) given various values of $i.
You say you Cannot get -v to work even without for loop: but then you show it working perfectly twice:
$ echo "foo bar" | awk -v var=" " '{print $1var$2}'
foo bar
In the above case you create an awk variable named var that contains one blank character " ". Then you print $1 (foo) followed by var (" ") followed by $2 (bar) and the output is <foo>< ><bar> exactly as it should be.
In all of your examples you are setting a variable to a single space character, concatenating that with some other values (e.g. -v var=" " then $1var$2) and then for some reason expecting that space character to not be present in the output.
$ echo "foo bar" | awk -v var=" " '{print $1'var'$2}'
foo bar
In the above case you create an awk variable named var that contains one blank character " ". When you write any shell script (awk, sed, grep, whatever) that's enclosed in single quotes:
any_cmd 'abc'
then you are telling cmd to interpret/execute what's inside the sign quotes. You cannot include single quotes in a single quote delimited script - that's shell fundamentals. So when you write:
any_cmd 'abc'def'ghi'
the inner single quotes are actually breaking out of the any_cmd language and back to shell to interpret and the shell attempts to it expand it before any_cmd is called. So if you have:
xyz=17
any_cmd 'abc'$xyz'ghi'
then what any_cmd actually sees to interpret is:
any_cmd 'abc17ghi'
but if you have something in there that the shell can't expand then it gets left as-is so:
and_cmd 'abc'def'ghi'
gets passed to any_cmd as:
any_cmd 'abcdefghi'
So back to your example:
$ echo "foo bar" | awk -v var=" " '{print $1'var'$2}'
foo bar
The var between $1 and $2 will be interpreted by the shell first since the 's around it are taking it out of the awk script and back to shell, but then it's just some text that shell can't expand so the above is passed to awk as-is which makes it:
$ echo "foo bar" | awk -v var=" " '{print $1var$2}'
and in a roundabout way you got back to your first script and again the output is as expected.
The above sounds complicated but it's actually extremely simple:
To concatenate strings in awk, just put them side by side.
To pass the value of a shell variable to awk, use -v, e.g. awk -v awkvar="$shellvar" 'print "foo" awkvar "bar"'.
Rather than trying to learn awk by trial and error, read the book Effective Awk Programming, 4th Edition, by Arnold Robbins first and then play with it.