de tu ultimo script, fijate que eliminastes la referencia de document. es decir,
var d = document;.
Cita: Lo único que no entiendo es por qué tengo que hacer primero
var valor = d.getElementById('numCaracteres');
y depués
valor.value = 1000 - caracter;
porque cada propiedad devuelve un tipo de valor. la propiedad
value devuelve una
copia del tipo string. los string no hacen referencia a la fuente original. es decir, no existe un enlace entre la variable y la fuente original del string. en cambio, el contenido devuelto por getElementById es una
referencia del elemento. como dice la palabra, las referencias apuntan a una fuente. por esa razon primero debes obtener el elemento y luego acceder a la propiedad.