I can explain the behaviour but am not sure what the correct way to solve it is (environments make my head hurt).
The problem is that your anonymous function picks up an environment. it is the environment in which it will look for objects, including instList. At the first iteration, it gets this environment <environment: 0x28e19a8> and this is the current environment for your function that is being evaluated (assign.instrumentslist()):
Browse[2]> environment()
<environment: 0x28e19a8>
At the next iteration of the loop the value of instList in the current environment <environment: 0x28e19a8> gets changed to "HO". Now both test.CL() and test.HO() have the same environment so refer to the same instList, which now has value "HO". The same thing happens in the final iteration for test.GC(). The following debugging transcript shows this:
debug at #5: assign(paste("test", instList, sep = "."), function() {
print(instList)
}, envir = .GlobalEnv)
Browse[2]>
debug at #3: instList
Browse[2]> environment(test.CL)
<environment: 0x28e19a8>
Browse[2]> eval(instList, environment(test.CL))
[1] "CL"
Browse[2]>
debug at #5: assign(paste("test", instList, sep = "."), function() {
print(instList)
}, envir = .GlobalEnv)
Browse[2]>
debug at #3: instList
Browse[2]> environment(test.CL)
<environment: 0x28e19a8>
Browse[2]> eval(instList, environment(test.CL))
[1] "HO"
When the loop is finished, the evaluation environment of the assign.instrumentslist(), <environment: 0x28e19a8>, persists because it is also the environment of your three functions. They all refer to the same environment and use the value of instList that was set during the last iteration of your loop.