$scope.text = '{"response":"{\"firstName\":\"John\",\"age\":454 }"}';
Проблема в том, что это не JSON.
Само по себе:
{"response":"{\"firstName\":\"John\",\"age\":454 }"}
... это JSON.
Однако, как только вы завернете его в строковый литерал JavaScript, \
используется как символ escape для строкового литерала JavaScript и получает его до того, как он появится в JSON.
При создании JSON, встроенном в JS, вам нужно бежать символы с особым значением в JS:
$scope.text = '{"response":"{\\"firstName\\":\\"John\\",\\"age\\":454 }\"}';
Было бы хорошая идея, чтобы перестроить структуру данных, чтобы ваш JSON не содержат строки JSON в первую очередь:
$scope.text = '{"response": {"firstName":"John","age":454}}';
Читайте о 'JSON.parse' – Rayon