I just remembered running into this as well. Trying to read a literal #hash results in immutable scheme hashes.
arc> (= h (w/instring f "#hash((a . 1))" read-table.f))
arc> (= h!b 2)
Error: "hash-set!: expects type <mutable table> as 1st argument..
The solution is to not use literal #hashes just like we don't use literal #t or #f. Use write-table and read-table, and make sure the tables you persist are read as lists.
Yeah I have those in my repo. Look for serialize in the link in my profile.
I'll add it to anarki later today.
Update: I just found myself complaining about this nearly 3 years ago, along with an implementation: http://arclanguage.org/item?id=10677. Not as clean as serialize, though.
Update 2: Ok, now read and write work with nested tables. You can read the output of write:
arc> (= h (w/instring f (tostring (write (obj a 1 b (obj c 3 d 4)))) read.f))
#hash((a . 1) (b . #hash((c . 3) (d . 4))))