until修飾子は後置きのifみたいな感じで使える構文です。
違いは、フラグが立つまで延々と読み続けてくれること。
StringIOやSerialPortみたいな読みに行く系ライブラリでは重宝します。
実際のところ
たとえば、以前扱ったN進数リテラルが混在している文字列を切り分ける用途をStringIOで書き直す場合、
require 'stringio' s = StringIO.new("\u0012aga\x98ga987HH") (ary ||= []) << s.read(2) until s.eof? p ary
てな感じでやることができます。
これは、
require 'stringio' s = StringIO.new("\u0012aga\x98ga987HH") until s.eof? (ary ||= []) << s.read(2) end p ary
と等価です。
入り組んだ処理はメソッドにまとめてしまえば見通しよく書き直せる……かも?