Канал done у вас в обоих случаях не буфферизированый - это значит что для выполнения операции записи в канал должны быть готовы и писатель (ch<-val) и читатель (<-ch).
В первом варианте у вас писатель готов совершить операцию, но у него нет читателя и этот поток исполнения ставится на паузу, до тех пор, пока не появится читатель, а читатель определён в этом же потоке поэтому его никогда не будет. Программа зависнет и может упасть с ошибкой.
Это можно поправить сделав канал буфферизированным
done := make(chan book, 1)
Второй случай работает, т.к. писатель и читатель в разных потоках и могут дождаться друг друга.