'Lose' came from Old English (OE) word losian while 'loose' was taken from Old Norse around the thirteenth century. There was a process in OE through which s, f and th became voiced respectively to [z], [v] and [ð] when they occurred between voiced sounds i.e. between two vowels or a vowel and anther voiced sound. There was no phonemic contrast of voice among the OE fricatives.
The ⟨s⟩1 in the OE form of 'lose' was intervocalic (between vowels), so it became [z] which survived into Modern English (ModE).
'Loose' came into English in the thirteenth century by the time the voicing was no longer productive, so it retained the original [s] sound.
There are lots of pairs that exhibit the same sound change such as wolf/wolves, bath/bathe, house (n)/house (v), breath/breathe, life/lives, loaf/loaves, close (adj)/close (v), knife/knives, cloth/clothes etc. All these are the remnants of OE property called intervocalic fricative voicing
Old English had a phonetic property called fricative voicing, whereby non-velar fricatives—s, þ ~ ð2, f—became voiced when they were flanked by vowels, or a vowel and another voiced consonant. The fricatives s, þ ~ ð, f were voiceless elsewhere. /ʃ/ was always voiced.
There were no distinctive voiced fricatives in Old English. The realisations [f - v], [θ - ð] and [s - z]3 were allophonic. It was the only way to get [z], [v] and [ð] because Old English didn't have phonemic [z], [v] and [ð]. In a nutshell:
- [f] and [v] were the allophones of the phoneme /f/
- [s] and [z] were the allophones of the phoneme /s/
- [θ] and [ð] were the allophones of the phoneme /θ/
- Wolf was wulf and it would've been pronounced [wulf], wolves was wulfas and would've been pronounced [wulvɑs].
- House (noun) was hūs and would've been pronounced [huːs], house (verb) was hūsian and would've been pronounced something like [huːziɑn].
- Bath (noun) was bæþ and pronounced [bæθ], bathe was baþian and would have been pronounced [ˈbɑ.ði.ɑn].
- Close (verb) was clȳsan and would've been phonetically [ˈklyː.zɑn], close (adj) was clȳs, and would've been [klyːs].
Note that the fricatives were phonemically voiceless; the voicing was allophonic.
Lose vs loose
Lose came from Old English losian. The s was intervocalic, so it became [z] due to that property:
In Middle English, it became losen ([ˈloːzən]), then it lost the terminal nasal and became [ˈloːzə], then the terminal schwa was lost and the vowel [oː] was changed to [uː] by the Great Vowel Shift.
Loose entered English in the 13th century and by that time, the voicing wasn't productive anymore. So it retained its original /s/.
- I use ⟨angled brackets⟩ for orthography/spelling.
- þ (thorn) and ð (eth) were used interchangeably by OE scribes to represent the th sounds. Do not confuse ð with IPA [ð].
- [Square brackets] are for allophones/contextual variants.