También he estado buscando una solución a este problema, esto es lo que finalmente se me ocurrió:
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;
}
Puedes probarlo aquí: http://jsfiddle.net/B5Zrx/
\ u200E es un carácter de formato que he visto en alguna versión de IE (es unicode marca de izquierda a derecha).
Supongo que si el tiempo formateado contiene algo como "XX: XX: XX", entonces debe ser tiempo con segundos y elimino la última parte, si no encuentro este patrón, nada cambia. Bastante seguro, pero existe el riesgo de dejar segundos en algunas circunstancias extrañas.
Solo espero que no haya una configuración regional que cambie el orden de las partes de tiempo formateadas (por ejemplo, haga que sea ss: mm: hh). Sin embargo, esta marca de izquierda a derecha me pone un poco nervioso por eso, es por eso que no elimino la marca de derecha a izquierda (\ u202E): prefiero no encontrar una coincidencia en este caso y dejar el tiempo formateado con segundos en tal caso.