The main issue is that due to the asynchronous nature of timer functions, the loop is done running before the first timeout is called, and therefore i is set to 2 by the time the first timeout runs, and stays the same for the other two timeouts
To overcome this, you should consider refactoring the code to use an interval instead, which allows you to change the value of i in sync with the closures:
var i=1;
var handle = setInterval( function() {
x.value = (i*2) + "seconds";
i++;
if (i>3) clearInterval(handle);
}, 2000 );
Other than that the loop is running from 0 to 2, instead of 1 to 3, like in timedText()