It doesn't. By default it will render the whole tree again. This happens in javascript and is probably much faster than you think.
However, when an app grows large enough, this can be a source of performance issues, which is why React provides ways you can inform it about work it shouldn't have to do, namely shouldComponentUpdate. If you can compare the data and determine that a particular sub-tree doesn't need to be updated you can implement a shouldComponentUpdate callback that does this. Immutable data that can be cheaply compared by checking reference equality is the preferred way of doing this.
More info on this was recently added to the docs: http://facebook.github.io/react/docs/advanced-performance.ht...