ObjectManager.instance.objectsBySystem.Add(123, new List<Obj>());
Is equivalent to:
List<Obj> list = ObjectManager.instance.objectsBySystem;
list.Add(123, new List<Obj>())
so you are only using the getter, however the Dictionary is mutable and as such changes can be made once it is handed to the other class.
Microsoft have some support for an ImmutableDictionary but it is at .NET 4.5 and not available for unity.
Depending on the properties of a Dictionary you value most you could implement a class that takes a copy of the key/value pairs and stores them as parallel ImmutableLists this would allow you to implement data look up but would not have the speed of a true hashmap.
The easiest (and probably fastest to execute) would be to encapsulate the Dictionary and provides accessor methods for the functionality you want to reveal.
private Dictionary<int, List<Obj>> objectsBySystem = new Dictionary<int, List<Obj>> ();
public bool ObjectsContainsKey(int key) {
return objectsBySystem.ContainsKey(key);
}
public List<Obj> ObjectsGetValue(int key) {
return objectsBySystem[key];
}