I am assuming from what you have done, you are attempting to make a function that takes two arguments (substance name and amount) and defines a variable with that name and assigns it a value of the concentration with the appropriate unit.
The issue with you first function is the assignment statement (substance = something). There is nothing wrong with the function it self which why there are no errors when you defined it. However when you used the function like concSetUG["symazine",100]
it creates the appropriate unit quantity, but it then tries to the assign that quantity to the string "symazine." This is what is causing the error message you see: "cannot assign to raw data object".
The raw data object in this case is the string "symazine" which can't be assigned a value. In Mathematica assignment statements consists of assigning expressions to symbols, such as (a = 5) , but ("a" = 5) would not work.
Creating functions in Mathematica that can create variables is very tricky to implement but here is something that you could try.
concSetUG[substance_, conc_] := (Clear[substance]; substance = Quantity[conc, IndependentUnit[ToString[substance]] "Micrograms"/"Liters"])
concAddUG[substance_ , conc_] := substance + Quantity[conc, IndependentUnit[ToString[HoldForm[substance]]] "Micrograms"/
"Liters"]
SetAttributes[{concSetUG, concAddUG}, HoldFirst]
The first function takes in the symbol name for the substance and clears the symbols of its previous value then assigns it's new value.
To get the string necessary for IndependentUnit I just use ToString[] on the symbol.
One thing to note in my implementation is that you need to pass the symbol name into the function not the string. This is because I was to lazy to figure out how to get it to work with a string argument.
concSetUG[symazine, 100]
This will make a variable symazine the with the value Quantity[100, ("Micrograms" IndependentUnit["symazine"])/("Liters")]
Looking at the modified add function.
concAddUG[symazine,100]
This gives the value Quantity[200, ("Micrograms" IndependentUnit["symazine"])/("Liters")]
The last line 'SetAttributes{concSetUG, concAddUG}, HoldFirst]' is what allows these functions to work. It makes these functions pass by reference rather than pass by value. Without these statements the argument substance would be immediately evaluated to its value, which means you couldn't clear the symbol or take its string. If you want to learn more about how this works [here is a good place to start.
If I hope this is what you are looking for. If you have more questions I'll try to help if I can.