When looking up the word 낯익다 in the dictionary, I was surprised to find it was pronounced [난닉따]. I would have expected the ㅊ to have been voiced in the second syllable because of its initial ㅇ, and thus pronounced as [나칙따]; however, this is obviously not the case. Where does the double ㄴ come from? Is this just an orthographic quirk or some rule I didn't know?
I would have expected the ㅊ to have been voiced in the second syllable because of its initial ㅇ, and thus pronounced as [나칙따]
You only know the half of the rule; the above rule applies only if the second morpheme is a functional morpheme, that only serves grammatical purpose. If the second morpheme has a specific meaning, that is if it's a content morpheme, then the first morpheme's final is reduced to one of the seven finals: ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, ㅂ, ㅇ.
익다 is an adjective meaning "to be familiar", so it's a content morpheme. So, 낯익다 becomes [낟익따] first. Then, a second rule called 사잇소리 현상(also called ㄴ첨가 "ㄴ-addition") comes in, which states:
In a compound word where the second morpheme start with a ㅣ or a /j/(ㅑㅕㅛㅠ), then ㄴ is added to the initial.
So [낟익따] becomes [낟닉따], then the ㄷ is assimilated into ㄴ, making it [난닉따]. Note that for some speakers the 사잇소리 현상 is limited, so some of them pronounce the word [나딕따], which is not the standard but still common enough.
Other examples you should look into (a hyphen (-) is used to mark the morpheme boundaries, not written in real life):
밭 아래[바다래], 늪 앞[느밥], 젖-어미[저더미], 맛-없다[마덥따], 겉-옷[거돋], 헛-웃음[허두슴], 꽃 위[꼬뒤]
솜-이불[솜ː니불], 맨-입[맨닙], 꽃-잎[꼰닙], 영업-용[영엄뇽], 직행-열차[지캥녈차], 어학-연수[어항년수], 물-엿[물렫], 휘발-유[휘발류]