ここは見た?
https://github.com/oreilly-japan/deep-learning-from-scratch/wiki/errata

確かに設計としてどうかと思うけど間違ってはないよ
numerical_gradientの実装コードみると内部で第2引数のnet.Wの値が変更されることになる
そののちにfが呼び出されるからちゃんと意図通りに動く