Смотри. data - хендлер файла, который имитирует поведение словаря. У него есть метод __setattr__, который вызывается непосредственно тогда, когда ты пишешь оператор "квадратные скобки" с равенством. В твоём случае:
data['key'] = {'this': 'is dict'}
Тип данных data - shelve
Тип данных data['key'] - словарь
Когда ты пишешь вот это:
data["quiz1"]["theme"] = "Cinematograph"
вызывается метод __setattr__ у
словаря data["quiz1"]
И он никак не связан с shelve. Поэтому, чтобы делалось то, что ты хочешь, нужно переписать как-то вот так:
import shelve
data = shelve.open("quiz")
data["quiz1"] = {"theme" : None}
tmp = data["quiz1"]
tmp["theme"] = "Cinematograph"
data["quiz1"] = tmp
print(data["quiz1"]["theme"])
data.close()
Либо открывать shelve с ключом writeback=True: data = shelve.open('quiz', writeback=True)
Но writeback нужно использовать аккуратно:
Because of Python semantics, a shelf cannot know when a mutable persistent-dictionary entry is modified. By default modified objects are written only when assigned to the shelf (see Example). If the optional writeback parameter is set to True, all entries accessed are also cached in memory, and written back on sync() and close(); this can make it handier to mutate mutable entries in the persistent dictionary, but, if many entries are accessed, it can consume vast amounts of memory for the cache, and it can make the close operation very slow since all accessed entries are written back (there is no way to determine which accessed entries are mutable, nor which ones were actually mutated).
Кстати, в документации об этом написано.