The recurse is what kills you. To lighten the burden of recursively searching Classes, you can manually specify a Depth. If you KNOW how many steps your key is into the Registry Hierarchy, you can cut the speed significantly. For example:
$Timer = New-Object System.Diagnostics.Stopwatch
######NORMAL#######
#Completes in 70.2157527 Seconds on my system
$Timer.Start()
Get-ChildItem -Path "HKLM:\Software\Classes" -Recurse | Get-ItemProperty -Name "AlwaysShowExt" -ErrorAction SilentlyContinue | Out-Null
$Timer.Stop()
$Timer.Elapsed
$Timer.Reset()
######DEPTH 1######
#Completes in 12.7461096 Seconds on my system
$Timer.Start()
Get-ChildItem -Path "HKLM:\Software\Classes" -Recurse -Depth 1 | Get-ItemProperty -Name "AlwaysShowExt" -ErrorAction SilentlyContinue | Out-Null
$Timer.Stop()
$Timer.Elapsed
$Timer.Reset()
######DEPTH 2######
#Completes in 33.9162044 Seconds on my system
$Timer.Start()
Get-ChildItem -Path "HKLM:\Software\Classes" -Recurse -Depth 2 | Get-ItemProperty -Name "AlwaysShowExt" -ErrorAction SilentlyContinue | Out-Null
$Timer.Stop()
$Timer.Elapsed
$Timer.Reset()
Your best results are going to be with a Depth of 1, but Depths of 2 or 3 will still be faster than not specifying.