I've seen this behavior as well, and it's not obvious because when you first create the column (and every time you edit the column) everything looks fine and dandy.
I've found that I can get around this problem using a SharePoint Designer workflow. The workflow updates an ordinary text field to store the ID value, and then calculated columns can reference that text field instead of the actual ID field.
The steps:
- Add a text field to my list called ItemID
- In SharePoint Designer, add a new workflow to the list and set it to trigger whenever items are added or updated.
- Add a workflow action to store the item's ID into a string (Build Dynamic String)
- Add a workflow action to set the ItemID field to the value I saved in the previous step (Set Field in Current Item)
- Add a workflow action to update the current item (Update List Item)
Then I just have to reference [ItemID] in my calculated columns instead of [ID] and it works like a charm.
One downside is that the users end up seeing the ItemID field on the New and Edit forms unless you do something to hide it.
If you've got more time on your hands and want to avoid spamming the workflow history list, you can perform this same workaround in an event handler.