As far as I know, the sound 'w' is always pronounced as 'v', and 'v' as 'f' in German words, relative to their cognate English words. So my questions, why did these sounds shift, and when? As far as I know, neither shift is die to the High German Consonant Shift, though I could be mistaken.
You're right that it's not part of the High German Consonant Shift.
I don't know the exact dates, so this is not exactly an answer, but it's too long to be a comment. I wanted to post some additional information about the etymology that is relevant.
W as [v]
German "w", as you mentioned, is generally cognate to English "w" ([w]) and for this reason the corresponding Proto-Germanic phoneme is standardly reconstructed as [w]. German and English are standardly classified as further belonging to the "West Germanic" group specifically, so we can extend the reconstruction of [w] to Proto West Germanic.
I Googled and found a book, Analysis of the Scandinavian Loanwords in the Aldredian Glosses to the Lindisfarne Gospels, by Sara M. Pons Sanz, that says North and West Germanic are thought to have split around 500 AD or later.
So it seems at some point between 500 AD and modern German, there was a shift of [w] to [v]. (This is an important part of your question that I don't know the answer to.)
It still patterns similarly to an approximant/sonorant in German phonology, though, and I believe that there are regions in Germany where a more approximant pronunciation [ʋ] is used. (Wikipedia says this is more common in Southern accents.) So in a way, you could say the change of the approximant /w/ to an unambiguously fricative /v/ is not fully complete across German even today.
V as [f]
German "v" (in native words) corresponds to Proto-Germanic *f, which we're pretty sure was a voiceless labial fricative of some sort (either [f] or [ɸ]); this developed in English to "f" and "v".
In modern standard German, "v" is pronounced as [f] in native words. The explanation I remember learning for the spelling is that it represents a feature that was present in some historical dialects of leniting/voicing word-initial and intervocalic *f to [v], similar to the leniting/voicing of word-initial *s to [z] that is well-known as a feature of standard German today (a number of regional accents of German have voiceless [s] in this position, however).
The Wikipedia article I linked to earlier says that there are accents of German that retain a distinction between semi-voiced or lenis f/v, from *f, and fortis f, from consonant-shifted *p. (This is similar to the constrast between intervocalic "s" and "ß" in modern standard German.)
However, this phonological information doesn't seem to be enough to determine the date of voicing/lenition of /f/ to /v~v̊/, because there is evidence that the HGCS initially resulted in geminate fricatives like /ff/ intervocalically. So voicing/lenition could have applied either before the HGCS, or after it, as long as it occured at some point before the loss of consonant length (a loss that I have heard is not complete in all modern German accents) and was restricted to affecting singleton /f/, not geminate /ff/.
Word-initial voicing of *f to [v] also occcured in at least some accents of Dutch (explaining the standard Dutch spelling of words like "vriend", which corresponds to the pronunciation with [v] that is present in some modern accents of Dutch, although others have voiceless [f]) and in some old accents of English (explaining the "v" in "vixen" and "vat"). However, I don't believe this voicing reflects a shared inherited feature of English, Dutch and German, but a regional tendency towards voicing word-initial as well as intervocalic fricatives (which is most robustly evident in the reflex of *þ as /d/ in both German and Dutch).
Evidently, this voicing process was either reversed, or did not occur for *f in accents ancestral to modern Standard German pronunciation.
Dialect mixing seems to have resulted in the rather random use of word-initial "v" vs. "f" in modern German spelling.