This is the approach we were talking about with Bytecoin above. The income is reduced by a multiple determined as function of size^2. This, sadly, does not work in the long run once subsidy is not an overwhelming portion of miner income, because transactions will just pay miners directly (e.g. just author N different transactions, one for each miner you know of, each including an output for that miner. Eligius started supporting being paid fees in this way in 2011).
A version that wasn't a multiple but instead was an absolute number of coins to destroy might work, since you couldn't escape it by moving fees to outputs but then you have a free parameter of not knowing the value of a bitcoin to its users and as we've seen with fees, constants that depend on how much a bitcoin is worth easily get out of wack. Any magical thoughts there?
In what I proposed above you don't give up on a percentage of fees (which may be zero due to out of band fees) but on the block reward itself. And you need to do that for every single block to exceed the 1MB, it does not change the limit for future blocks. For example, if for x% of the block reward you may increase the block by N*x%, with N=10, the new block limit range becomes 1-11MB for a linear range of subsidies from 25 to 0BTC. There is no way to "cheat" with out of band fees.
At the highest end there is no block reward at all. It is true this will become cheaper for miners as the block reward goes down, and eventually it will be free, but in my opinion that's a feature compensating for cheaper future storage and processing resources. With N=10 and today's subsidy, few miners would elect to create larger blocks unless the market changes a lot, but it becomes more reasonable over time.