I ran into this issue today after upgrading from 1.1 to 2.0. In my particular scenario my API is a 'Gateway' for a number of microservices. In a number of instances after receiving a response from the downstream microservice the controllers were returning this response using a StatusCodeResult, retaining the status code from the result of the call to the downstream services.
After upgrading to 2.0 I found that any response from a downstream service which contained JSON was now being wrapped in additional quotes when being returned to the client of the gateway API, producing invalid JSON as the end result. I assume this is a result of the Json output formatter now being applied to this in 2.0 and being unable to deserialize the content correctly, whereas in 1.x the StringOutputFormatter would have been applied.
For now I have used the workaround that was suggested and this is working fine. I would like to move to returning ContentResult, but at present it seems this always produces a 200 result. The ability to provide a status code when creating a ContentResult using Content() has been mentioned in this thread, that would be a great help.