1. I believe that git will first compare the stored hash of the two files (actually of the two trees, so if the trees are the same it doesn't bother checking the individual files), only if that is different will it actually do the diff
2. This has been discussed, and most of the design work has been done for a couple of different possible solutions.
the first is to store the files separately and just have a reference of how to get the file inside the existing git records. the design work has been mostly done, but nobody has taken the time to code it (GSOC interest anyone ;-)
the second is to modify the pack format to handle larger things. There are people working on this, but since this would be a very invasive set of changes they are trying to anticipate all possible improvements and so it is moving very slowly