This is correct only with short-circuit evaluation of the OR, yes?
Indeed. When {$B+} is on for some reason (full boolean evaluation), the field access will raise an exception once EOF is reached.
Hey... it's pascal... we can make a function for that

(you could even use fieldnames instead of [ 0 ] )
function DataSetDoneOrReachedLimit(DataSet: TDataSet; Limit: Integer): Boolean;
begin
Result := DataSet.EOF;
if not Result then
Result := DataSet.Fields[0].AsInteger >= Limit;
end;
// usage:
until DataSetDoneOrReachedLimit(DataSet, 10000);
BTW. In practice the previous code with "DataSet.eof or (dataSet.Fields[0].AsInteger >= 10000)" won't crap out because even if EOF is true, the dataset still has the values from the previous record. So there wouldn't be an error (and because EOF is true the loop will end).
But that's only in practice... there could be situations (other than .Next / .EOF) where this kind of loop does crap out so it's still a good habit to use short-circuit evaluation (or a separate function in case of full evaluation).