I think I figured out my problem.
Instead of copying out the plist data from an NSMutableDictionary into an array, which would only give me the top level keys, I realised that in order to change nested key values I would have to copy the contents to a Swift native dictionary and then jump through a number of hoops to change a specific value, then copy everything back!
The issue before was that while I could access a specific value with a native dictionary, I was unable to mirror the same ability with an NSMutableDictionay:
var nativeDictionary: [String : [String : [String : String]]] = ["level1" : ["level2" : ["keyWord" : "egg"]]]
nativeDictionary["level1"]?["level2"] = ["keyWord" : "bacon"]
The other issue I found was that if I attempted to amend the NSMutableDictionary nested value it would work, but replace the entire value set, which got me thinking about copying it aside, to work on it, and copy it back.
Checking "under the hood" to see what instance methods were available I realised that it was only possible to edit the top level key value pairs (and that cast into an Array the Any type wouldn't get me anywhere), and so it became obvious that I would need to extract the specific key value pairs and replace them:
muteDict //NSMutableDictionary
var muteEditedDict = Dictionary<String, Any>(_immutableCocoaDictionary: muteDict) //convert NSMutableDictionary into a native Swift Dictionary: [String : Any]
var level1EditedDict = muteEditedDict["level1"] as? [String : [String : String]] //cast value one level in as nested dictionary
var level2EditedDict = level1EditedDict?["level2"] //cast value next level in as nested dictionary
level2EditedDict?.updateValue("newValue!", forKey: "keyWord") //edit the value to become: "newValue!"
level1EditedDict?["level2"] = level2EditedDict //copy the edited key pair back into the second level key pair
muteEditedDict["level1"] = level1EditedDict //copy the second level up into the first
editDict.setDictionary(muteEditedDict) //convert the chunk of plist back into the original NSMutableDictionary format expected
This was a lot more cumbersome than I had of wished for, and it is the only method I can get to reliably work, but I'm open to suggestions for anything else that's easier or more up to date (and safer?).
I wish that I could have just used muteDict["level1"]?["level2"] = ["keyWord" : "bacon"], but no, it had to be something a lot harder didn't it.