According to Vitalik Buterin here:
The constraint is to preserve a property that history is irrelevant past a certain point and state is all that matters; it improves efficiency and code simplicity for many kinds of nodes.
The 256 block limit is also mentioned in the Ethereum Yellow Paper by Gavin Wood at page 25.
I would argue that an on-chain service via a contract to perform this task, such as the one you linked to, is sufficient for getting block hashes beyond the previous 256. Ethereum's vision as a platform is to be general and enable building decentralized services, so many of the aspects of the design may not cater to features such as complete block hash history. This may be because doing so would open the door to less generalization and more complications/bugs, besides setting a precedent of adding features to facilitate certain needs or use cases.