max_execution_time is not respected by CLI PHP, problem might be related to memory. You can run runcronjobs.php script with -dall option for debugging.
Are you sure about the hardcoded limit? The way I understand the code the script just fetches 50 items each time and processes them before fetching the next chunk of 50 items. But as it does do that until the query does not return any items anymore, all items in the pending queue should be processed at the end.
I should have looked better :-) You're right about the code.
After indexing the first 50 pending actions, these pending actions get removed. But the offset is also increased ( on line 79 on trunk: <i>$offset += $limit;</i> ), so the next query will miss the next first 50 pending actions. Seems to be a bug (<i>http://ez.no/bugs/view/8874</i>).