Gostaria de saber se o driver é inteligente o suficiente para atualizar apenas o menor subconjunto de alterações ou se está apenas atualizando cegamente a coisa toda?
Não, se você usar o método de atualização "normal", todo o objeto será enviado pela rede. Suspeito que o próprio servidor de banco de dados será inteligente o suficiente para atualizar apenas os índices necessários (e não os que não foram alterados), se possível (ou seja, o objeto pode ser atualizado no local e não precisa ser movido porque cresceu muito)
O que você pode fazer é usar as funções "modificador de atualização atômica". A documentação Java é um pouco leve sobre eles, mas como o driver apenas transmite o JSON, o material dos tutoriais não Java deve funcionar, por exemplo:
shapes.update((DBObject)JSON.parse( "{ 'foo' : 'bar'}"),
(DBObject) JSON.parse( "{ '$set' : { 'foo': 'bat'}}") );