Veamos los %s en tu código:
Primer %s en linea 5
Código PHP:
<span class="datos\">Mensualidades:</span><input name=\"meses\" type=\"text\" size=\"3\" class=\"moneda\" value=\"%s\" />
Segundo %s en linea 6
Código PHP:
<span class="datos\">Fecha para pago:</span><input name=\"fecha_pago\" id=\"fecha_pago\" type=\"text\" size=\"12\" readonly=\"true\" value=\"%s\" />
Tercer %s en la linea 12
Código PHP:
<span class="datos\">Observaciones:</span><br/><span class=\"datos\"><textarea name=\"OBSERVACIONES\" cols=\"80\" rows=\"3\">%s</textarea></span>
Cuarto %s en la linea 15
Código PHP:
<input name="id\" type=\"hidden\" value=\"%s\" />
O sea tienes 4 %s...
Veamos ahora la función sprintf()
sprintf($html,$row['meses'],date('Y/m/d', strtotime($row['fecha_pago'])), $row['OBSERVACIONES'])
El primer parámetro te indica la cadena a leer:
$html Luego de ese parametro le siguen tres más de reemplazo. Tres parámetros de reemplazo versus 4 %s. Esta mal.