Eu também tenho procurado solução para este problema, eis o que eu acabei inventando:
function getTimeStr() {
var dt = new Date();
var d = dt.toLocaleDateString();
var t = dt.toLocaleTimeString();
t = t.replace(/\u200E/g, '');
t = t.replace(/^([^\d]*\d{1,2}:\d{1,2}):\d{1,2}([^\d]*)$/, '$1$2');
var result = d + ' ' + t;
return result;
}
Você pode experimentá-lo aqui: http://jsfiddle.net/B5Zrx/
\ u200E é um caractere de formatação que eu já vi em alguma versão do IE (marca unicode da esquerda para a direita).
Suponho que se o horário formatado contiver algo como "XX: XX: XX", deve ser o tempo com segundos e removo a última parte; se não encontrar esse padrão, nada será alterado. Bastante seguro, mas existe o risco de deixar segundos em algumas circunstâncias estranhas.
Eu só espero que não haja um código de idioma que mude a ordem das partes do tempo formatadas (por exemplo, torne ss: mm: hh). Essa marca da esquerda para a direita está me deixando um pouco nervoso com isso, é por isso que não removo a marca da direita para a esquerda (\ u202E) - prefiro não encontrar uma correspondência nesse caso e deixar o hora formatada com segundos nesse caso.