You can mutate the dictionary, as dictionaries are mutable. This means you can add an entirely new key/value pair, or change the value associated with a key. You can't mutate the existing value object that some key points to (in this case, because the dictionaries value is an immutable type).
You are also copying all of the data out of the original data source when creating the dictionary, you are not copying references to any of the values, or deferring execution in any way, so there are no changes that could be made to the source data structure that could be observed in the new dictionary.
Shouldn't a anonymous type value be immutable?
They are. That doesn't mean that any data structure you put them in is also immutable though.
You could use an IReadOnlyDictionary
if you want to ensure the dictionary isn't mutated, but given the fact that you're using an anonymous type, you shouldn't be using this dictionary outside of the scope of the current method; given that, you really shouldn't need to go to such lengths to prevent mutation of the dictionary, as you are the only one who should be able to mutate it.