to answer your title question, you have to clone the material and then change what should be different. but if you just clone it, the live inputs of the original material aren’t available anymore.
so for now, you can use one of the experimental nodes from the Materials category if you really have to do that:
they try to take care of this job.
but it is easier to just go with option a) and create two materials and switch them. the SetEmissive will also create a second material, so there isn’t that much won in using it.
another quick end easy way is to use instancing with the ColorPerInstance node to change the color of an individual object.
some background information: a material represents the whole render pipeline, not just the color. so when you modify a material, you potentially change the look of other models that are rendered with the same material/render pipeline. the material is kind of a big GPU render function that comes with parameters. right now we set these parameters where we create the function and we don’t provide a way to provide the parameters for the function at a later point / when it is rendered.
so actually, there would a third option: set the color (or another material property) in the draw call, just before rendering, but we don’t have nodes for that yet. you would need some kind of reference to the shader inputs and modify them just before rendering.