In short
You are reading: «33.33 percent, 66.66 percent, done», or more literally «3333 per ten thousand (‱), etc». These percentages don't necessarily correspond to a "fraction of the evaluation time", but more likely to a "fraction of the total number of steps", in this case: 3.
In detail
The cursor displays the current progress, mapped to the range 0 to 9999.
It is called, for instance, in $SOURCE/blender/makesrna/intern/rna_wm_api.c like this:
static void rna_progress_update(struct wmWindowManager *wm, float value)
{
if (wm_progress_state.is_valid) {
/* Map to cursor_time range [0,9999] */
wmWindow *win = wm->winactive;
if (win) {
int val = (int)(10000 * (value - wm_progress_state.min) / (wm_progress_state.max - wm_progress_state.min));
WM_cursor_time(win, val);
}
}
}
where a given "value" is compared to a "min" and a "max" and expressed as "val" in terms of a fraction of 10,000 of the (min, max) interval. The function WM_cursor_time from $SOURCE/blender/windowmanager/intern/wm_cursors.c takes care of "visualising" the cursor.
Of course script creators can pass to the cursor number mapped to 1-100, or 1-1000 if they want: "WM_cursor_time" doesn't check that the number is a fraction of 10000. So it really depends on context here!
In your case, probably the process of loading an OBJ has three checkpoints, that were hard-assigned to 1/3, 2/3 and 3/3 and don't necessarily correspond linearly to their evaluation time. These fractions, mapped to 10000, with the decimal part ignored ("floor" rounding) are 3333, 6666 and 10000.
I speculate that what you are seeing are just the first two of these numbers while "10000" (999) is skipped because it's probably overridden by the next event.