ルートの onEnter や onChange フックでパスを変更すると、url が無限に変わるようです。しかし、子ルートのパスを変更すると機能します。実際には、認証を 1 か所で処理したいのですが、それ以外の場合は、すべての子ルートが同じロジックを処理する必要があります。
{
path: '/',
onChange: function(prevState, nextState, replace, callback) {
if(!logined) {
replace('login');
}
},
childRoutes: [
....
]
}