Проблема в том, что переменные (в частности, eml, fnl, lnl) содержат значения, полученные при их объявлении. JS не пересчитывает длину строк или значений элементов каждый раз, когда вызывается ваша функция.
Когда вы перемещаете эти переменные внутри функции, они фактически «пересчитываются» каждый раз, когда вызывается функция.
Я бы оставил переменные, которым назначены элементы DOM, за пределами функций, но переместил переменные, которые получают значения / длины элементов DOM внутри функций. Затем вы можете ссылаться на переменные, содержащие элементы dom.
Например (частичный код):
var na=document.getElementById('nr'),
ea=document.getElementById('er'),
em=document.subscribe.email,
fn=document.subscribe.fname,
ln=document.subscribe.lname;</p>
<p>function validate_form() {
var eml=em.value.length,
fnl=fn.value.length,
lnl=ln.lname.value.length,
at=em.value.indexOf("@"),
per=em.value.lastIndexOf(".");
// Rest of code.