While compute capability 2.0 and 2.1 share the same instruction set, there are differences in hardware organization between GPUs with those two compute capabilities. The “arch” flag instructs the compiler to generate instructions from the sm_2x instruction set, the “code” flag can then be used to tweak the code generations (e.g. instruction selection, instruction scheduling) differently for sm_20 and sm_21. The same concept exists with other compilers. For example, gcc has -march and -mtune flags, where -march selects an ISA to target and -mtune tweaks the code for specific CPUs using that ISA.
The pulldown menu presumably gives you theses choices for programmer convenience, so if you know you have a GPU with compute caopability 2.1, you can simply select that.
I have never checked how much difference there is between code tweaked for sm_20 and code tweaked for sm_21. As far as I understand the differences between these two HW architectures, I would expect the generated code for the two targets to look quite similar, and performance-wise it is likely a second order effect.