Hmm, interesting. Ye, that's pretty confusing.
When you call visualization.create() you interact directly with the Capabilities API and it will wire up the object for you and return the model. The model itself will expose a set of wrapper methods for the Engine API.
One of those methods is the setOptions() method which translates under the hood into the Engine API method ApplyPatches on the Generic Object class.
The ApplyPatches method needs properly encoded values to be able to tell integers and strings apart. That's why the strings in setOptions have to be either wrapped in single (or double depending on how you declare your string) quotes or escaped by a \.
However we should probably perform some additional type checking so you don't have to escape your strings.