This is my try:
createFileHandle[filename_] := {filename, 0};
readNewLines[{filename_, pos_}] :=
Module[{f, str},
f = OpenRead[filename];
SetStreamPosition[f, pos];
str = StringCases[StringJoin@ReadList[f, Character], Longest[StartOfString ~~ ___ ~~ ("\n" | "\r")]];
Close[f];
If[str == {},
{{filename, pos}, ""},
{{filename, pos + StringLength@First@str}, First@str}]];
It reads complete lines from a file, continuing from position of latest seen beginning of line on every try. The position logic probably breaks if your input has multi-byte characters (that is, it's anything beyong plain ASCII or eight-bit encoded input). If line delimiter used in your system is "\r\n" (CR LF - used by Windows), you probably want to use that instead of ("\n" | "\r") in StringCases to further avoid getting empty records.
You can view dynamic plot if you add new lines of CSV data to the test file test.txt:
DynamicModule[{f = createFileHandle["test.txt"], data = {}, newstrings},
Dynamic[
{f, newstrings} = readNewLines[f];
data = data~Join~ImportString[newstrings, "CSV"];
ListLinePlot[data],
UpdateInterval -> 1]]