A maior desvantagem é que o cliente deve ter JavaScript habilitado e ser poderoso o suficiente para executar uma boa quantidade dele. Também é mais difícil satisfazer as preocupações de acessibilidade ou qualquer outra coisa que dependa da análise de HTML estático (embora algo que conheça sua API específica provavelmente funcione melhor do que a varredura de HTML). Finalmente, é mais fácil ter vazamentos significativos de memória.
No que diz respeito a duplicar código ou colocar lógica de negócios no cliente - não sei quanto disso você precisa fazer. Se o modelo no cliente for um Modelo de Visualização (um modelo que corresponda ao mundo como a IU o vê, não um modelo de negócios), a lógica que combina o ViewModel com o modelo de negócios pode residir no cliente, o modelo servidor, ou um pouco de ambos. Depende de como você se sente ao ter sua API contendo uma fachada específica do cliente em vez de fazer com que o cliente converta entradas da interface do usuário em chamadas de API.
Você também pode querer olhar para knockout.js. Não posso dizer se é melhor do que o backbone, mas pode se adequar melhor ao seu projeto.