Why is the outer circle of human mitochondrial DNA ‘heavy’, whereas the inner circle is ‘light’?
The heavy strand is literally heavier than the light strand. The first, or at least one of the first, observations of this phenomenon was in this paper:

Corneo G, Zardi L, Polli E. 1968. Human Mitochondrial DNA. J Mol Biol 36(3):419-423.

They showed that alkaline denatured mitochondrial DNA separates into two bands upon ultracentrifugation in a cesium chloride gradient:


  Human mitochondrial DNA when centrifuged in alkaline CsCl in the analytical ultracentrifuge splits into two bands displaying densities of 1.727 g/cm3 and 1.766 g/cm3, respectively. The two bands appearing in the alkaline gradient correspond to the complementary strands of human mitochondrial DNA with a different GT/CA ratio... However, when an equimolar mixture of them is renatured by heating at 65°C for five hours in 2X SSC, a single band with a density very close to that of the native DNA is obtained. The latter experiment clearly indicates that the two bands correspond to the complementary strands displaying a bias in base composition. 


The difference in molar mass (M) is due to a higher purine content (Pu) in the heavy strand (which are heavier than pyrimidines). This can be seen by tabulating the base composition of the RefSeq sequence of human mitochondrial DNA:

               A      T      G      C      Pu(%)   M(kDa)
Light Strand   5124   4094   2169   5181   44      5063
Heavy Strand   4094   5124   5181   2169   56      5174




R script if anyone is interested:

#uses Biostrings
light = readDNAStringSet("mtDNA.fasta")
heavy = complement(light)

comp = function(seq) {
  ll = as.list(alphabetFrequency(seq)[1, c("A", "T", "G", "C")])
  ll["%Pu"] = with(ll, (A + G) / (A + T + G + C)) * 100
  ll["M(kDa)"] = with(ll, (A * 313.2) + (T * 304.2) + (G * 329.2) + (C * 289.2) + 79.0) / 1000
  return(ll)
}

comp(light)
comp(heavy)