Here are my findings...
Windows doesn't always send a WM_THEMECHANGED when a change occurs. For instance, for a change in background color, it doesn't send that message, it sends a different message.
As an example, when changing the background color, this is what Windows sends to the app:
<000001> 001F0640 S WM_SYSCOLORCHANGE
<000002> 001F0640 R WM_SYSCOLORCHANGE
<000003> 001F0640 S WM_SETTINGCHANGE wFlag:SPI_SETNONCLIENTMETRICS pszMetrics:00000000
<000004> 001F0640 S WM_GETICON nType:ICON_SMALL2
<000005> 001F0640 R WM_GETICON hicon:00000000
<000006> 001F0640 S WM_GETICON nType:ICON_SMALL
<000007> 001F0640 R WM_GETICON hicon:00000000
<000008> 001F0640 S WM_GETICON nType:ICON_BIG
<000009> 001F0640 R WM_GETICON hicon:00000000
<000010> 001F0640 S WM_WINDOWPOSCHANGING lpwp:0018FD0C
<000011> 001F0640 R WM_WINDOWPOSCHANGING
<000012> 001F0640 S WM_NCCALCSIZE fCalcValidRects:True lpncsp:0018FCE4
<000013> 001F0640 S message:0x0093 [Unknown] wParam:00000000 lParam:0018F970
<000014> 001F0640 R message:0x0093 [Unknown] lResult:00000001
<000015> 001F0640 S message:0x0094 [Unknown] wParam:00000000 lParam:0018F920
<000016> 001F0640 R message:0x0094 [Unknown] lResult:00000000
<000017> 001F0640 S message:0x0094 [Unknown] wParam:00000000 lParam:0018F920
<000018> 001F0640 R message:0x0094 [Unknown] lResult:00000000
<000019> 001F0640 S message:0x0094 [Unknown] wParam:00000000 lParam:0018F920
<000020> 001F0640 R message:0x0094 [Unknown] lResult:00000000
<000021> 001F0640 R WM_NCCALCSIZE fuValidRect:0000 lpncsp:0018FCE4
<000022> 001F0640 S WM_WINDOWPOSCHANGED lpwp:0018FD0C
<000023> 001F0640 S message:0x0093 [Unknown] wParam:00000000 lParam:0018F7A0
<000024> 001F0640 R message:0x0093 [Unknown] lResult:00000001
<000025> 001F0640 R WM_WINDOWPOSCHANGED
<000026> 001F0640 R WM_SETTINGCHANGE
<000027> 001F0640 S WM_SETTINGCHANGE wFlag:0000 pszMetrics:0008E2B8
<000028> 001F0640 R WM_SETTINGCHANGE
<000029> 001F0640 S WM_SETTINGCHANGE wFlag:SPI_SETFLATMENU pszMetrics:0008E2D8
<000030> 001F0640 R WM_SETTINGCHANGE
<000031> 001F0640 S WM_SETTINGCHANGE wFlag:SPI_SETICONTITLELOGFONT pszMetrics:0008E2D8
<000032> 001F0640 R WM_SETTINGCHANGE
<000033> 001F0640 S WM_SETTINGCHANGE wFlag:SPI_ICONHORIZONTALSPACING pszMetrics:0008E2D8
<000034> 001F0640 R WM_SETTINGCHANGE
<000035> 001F0640 S WM_SETTINGCHANGE wFlag:SPI_ICONVERTICALSPACING pszMetrics:0008E2D8
<000036> 001F0640 R WM_SETTINGCHANGE
<000037> 001F0640 S WM_WINDOWPOSCHANGING lpwp:0018FEF8
<000038> 001F0640 S WM_GETMINMAXINFO lpmmi:0018FBEC
<000039> 001F0640 R WM_GETMINMAXINFO lpmmi:0018FBEC
<000040> 001F0640 R WM_WINDOWPOSCHANGING
<000041> 001F0640 S WM_NCCALCSIZE fCalcValidRects:True lpncsp:0018FED0
<000042> 001F0640 S message:0x0093 [Unknown] wParam:00000000 lParam:0018FB5C
<000043> 001F0640 R message:0x0093 [Unknown] lResult:00000001
<000044> 001F0640 R WM_NCCALCSIZE fuValidRect:0000 lpncsp:0018FED0
<000045> 001F0640 S WM_WINDOWPOSCHANGED lpwp:0018FEF8
<000046> 001F0640 S message:0x0093 [Unknown] wParam:00000000 lParam:0018F98C
<000047> 001F0640 R message:0x0093 [Unknown] lResult:00000001
<000048> 001F0640 R WM_WINDOWPOSCHANGED
<000049> 001F0640 S WM_SETTINGCHANGE wFlag:SPI_SETNONCLIENTMETRICS pszMetrics:0008E2C8
<000050> 001F0640 S WM_GETICON nType:ICON_SMALL2
<000051> 001F0640 R WM_GETICON hicon:00000000
<000052> 001F0640 S WM_GETICON nType:ICON_SMALL
<000053> 001F0640 R WM_GETICON hicon:00000000
<000054> 001F0640 S WM_GETICON nType:ICON_BIG
<000055> 001F0640 R WM_GETICON hicon:00000000
<000056> 001F0640 S WM_WINDOWPOSCHANGING lpwp:0018FD0C
<000057> 001F0640 R WM_WINDOWPOSCHANGING
<000058> 001F0640 S WM_NCCALCSIZE fCalcValidRects:True lpncsp:0018FCE4
<000059> 001F0640 S message:0x0093 [Unknown] wParam:00000000 lParam:0018F970
<000060> 001F0640 R message:0x0093 [Unknown] lResult:00000001
<000061> 001F0640 R WM_NCCALCSIZE fuValidRect:0000 lpncsp:0018FCE4
<000062> 001F0640 S WM_WINDOWPOSCHANGED lpwp:0018FD0C
<000063> 001F0640 S message:0x0093 [Unknown] wParam:00000000 lParam:0018F7A0
<000064> 001F0640 R message:0x0093 [Unknown] lResult:00000001
<000065> 001F0640 R WM_WINDOWPOSCHANGED
<000066> 001F0640 R WM_SETTINGCHANGE
<000067> 001F0640 S WM_SYNCPAINT
<000068> 001F0640 S WM_NCPAINT hrgn:00000001
<000069> 001F0640 S message:0x0093 [Unknown] wParam:00000000 lParam:0018F554
<000070> 001F0640 R message:0x0093 [Unknown] lResult:00000001
<000071> 001F0640 S message:0x0093 [Unknown] wParam:00000000 lParam:0018F854
<000072> 001F0640 R message:0x0093 [Unknown] lResult:00000001
<000073> 001F0640 S message:0x0091 [Unknown] wParam:00000000 lParam:0018F854
<000074> 001F0640 R message:0x0091 [Unknown] lResult:00000000
<000075> 001F0640 S message:0x0092 [Unknown] wParam:00000000 lParam:0018F7EC
<000076> 001F0640 R message:0x0092 [Unknown] lResult:00000000
<000077> 001F0640 S message:0x0092 [Unknown] wParam:00000000 lParam:0018F7EC
<000078> 001F0640 R message:0x0092 [Unknown] lResult:00000000
<000079> 001F0640 S message:0x0092 [Unknown] wParam:00000000 lParam:0018F7EC
<000080> 001F0640 R message:0x0092 [Unknown] lResult:00000000
<000081> 001F0640 R WM_NCPAINT
<000082> 001F0640 S WM_ERASEBKGND hdc:3D0148D3
<000083> 001F0640 R WM_ERASEBKGND fErased:True
<000084> 001F0640 R WM_SYNCPAINT
<000085> 001F0640 P WM_PAINT hdc:00000000
Note that nowhere is a WM_THEMECHANGED message found.
Potentially useful messages sent to the app are: WM_SYSCOLORCHANGE and as @Xenno mentioned, WM_SETTINGCHANGE.
In this particular case, I'd choose the WM_SYSCOLORCHANGE because it is more specific.
There are two ways I use to find out what messages a program I've written gets.
1. use spy++ which comes with Visual Studio. The downside is that to get it you must install Visual Studio but, the good news is, you don't need the VS installation for it to work. That means you can install VS in some VM, copy the spyxxx executables to a directory outside the VM and from that moment, you can use spy++ anywhere and anytime you want (the executable is fully portable.)
2. I have code that can be included in any program that displays the messages a window receives. To my dismay and disbelief, I've been unable to find it. It's lost somewhere in the thousands of pieces of code I have laying around. Because of that, I'm going to re-write it because spyxx does miss some messages but, it will likely be a few days before I have a basic module done.
Note that in the list of messages Windows sends, there are message $91, $92, $93 and $94. Those are undocumented messages and they are reportedly used by the Windows Theme Manager. The problem is, no one seems to know exactly what they mean and when/why exactly they get sent. Because of that, it is probably unwise to depend on their presence to detect a theme change.
Lastly, there does not seem to be any way to determine what setting changed, only that something changed, not what.
HTH.