That's right, the function call asc(chr($i)) always returns the correct value $i. The problem comes up only if you concatenate strings. Some characters will stretch, others will shorten the resulting string as you can see in this code snippet
 Code:
dim $OutString1, $OutString2, $OutString3, $OutString4, $i

for $i=128 to 131 ; -> 4 Chars
  $OutString1 = $OutString1 + chr($i)
next
for $i=132 to 135; -> 4 Chars
  $OutString2 = $OutString3 + chr($i)
next
for $i=136 to 139; -> 4 Chars
  $OutString3 = $OutString3 + chr($i)
next
for $i=140 to 143; -> 4 Chars
  $OutString4 = $OutString4 + chr($i)
next

messagebox("Length of $$Outstring1 should be 4 but it is " + len($Outstring1) + @crlf +
           "Length of $$Outstring2 should be 4 but it is " + len($Outstring2) + @crlf +
           "Length of $$Outstring3 should be 4 but it is " + len($Outstring3) + @crlf +
           "Length of $$Outstring4 should be 4 but it is " + len($Outstring4), "String Length")
Let's take a look at your first example, but now we only examine the chars 128 to 159
 Code:
$cnt=0

For $i=128 to 158
   $cnt=$cnt+1
   $OutString = $OutString + chr($i)
Next

$nul = messagebox("Length of should be $cnt and it is " + len($Outstring), "String Length")
_________________________
The trouble with the world is that the stupid are cocksure and the intelligent are full of doubt. (Bertrand Russell)