plistlib を使用すると、辞書/リスト構造を plist にシリアル化できます。これは問題なく動作し、同じライブラリで読み返すこともできます。
問題は、辞書のタイプが「_internalDict」であり、それらを変更できないように見えることです。たとえば、次のようになります。
d = plistlib.readPlist('someplist.plist')
v = d['value'] # v is an _internalDict
v['val'] = 'new val' # works
del v # doesn't work
v = {'someotherkey': 'someothervalue'} # doesn't work either
plistは変更されていないようです。ヘルプ?