I'm not sure I follow. In your example line, are the $crlf's meant to be actual newlines or the actual identifier '$crlf'?
I'm getting the correct values either way:
//write test.txt one $crlf two $crlf three
; test.txt now contains three lines separated by carriage-return + line-feeds
//echo -a $read(test.txt, n, 1) -- should be: one
one -- should be one
//echo -a $read(test.txt, n, 2) -- should be: two
two -- should be two
//echo -a $read(test.txt, n, 3) -- should be: three
three -- should be three
; All returned correctly!
//write -c test.txt
; test.txt has been cleared
//write test.txt one $!crlf two $!crlf three $!crlf
; test.txt now contains one line with the text $crlf appearing between each word
//echo -a $read(test.txt, n, 1) -- should be: one $!crlf two $!crlf three
one $crlf two $crlf three -- should be: one $crlf two $crlf three
All seems fine here.
Edit:On reading your post again it seems you misunderstand how EOL characters work. You cannot have an EOL character in the middle of a line because it is the End-Of-Line character - it's literally the character that represents where a line ends in a text file. If you use something like:
//write test.txt one $crlf two $crlf three
you are actually writing three lines to the file at once. It's not a mIRC bug, it's how text files work. If you open the file in any text editor you'll see it as three lines aswell.