"FIRST_ROWS" is a bad idea because its a heuristic, ie, apply some 'hard and fast' rules about how to optimize a query. Better to use FIRST_ROWS(1), which is saying use a *costing* model for the first row, not a costing model + plus some special overrides.
So we'll do that, and the plans you'll see are:
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 38319 | 4789K| 3 (0)| 00:00:01 |
|* 1 | INDEX FULL SCAN | IX | 38319 | 4789K| 3 (0)| 00:00:01 |
-------------------------------------------------------------------------
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 128 | 9 (0)| 00:00:01 |
| 1 | CONCATENATION | | | | | |
|* 2 | INDEX RANGE SCAN| IX | 11496 | 1437K| 3 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN| IX | 15327 | 1915K| 3 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN| IX | 11496 | 1437K| 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
so you can see why we choose the former. Having said that, its probably a shortcoming of the optimizer algorithm in that its assuming that the full scan will be cheap no matter why the data lies "within" the index, ie, it seems to not take into account that we'll need to scan a lot of "dead" data before getting to year 2005.