Scripts Lua ou um padrão de bloqueio resolveriam seu problema.
EVAL 'local obj = cjson.decode(redis.call("GET", "key1")); obj.prop1.subprop1 = ARGV[1]; redis.call("SET", "key1", cjson.encode(obj));' 0 "did_change"
Você pode até fazer algo mais avançado em Lua para editar os subobjetos JSON de qualquer chave, se quiser.
Consulte os documentos do comando Redis SETNX para obter um exemplo de como usar um bloqueio.