A hashtable is just a dictionary. In your case you're really just using it to store a set of values and inside your loop you're actually looking at each value directly so the foreach loop isn't doing anything here. Just compare the values from the old and new hash directly.
if ($new_hash.boot1 -ne $old_hash.boot1) {
bcdedit /set '{xxxxxxxx-3af2-11ec-ac8e-444444a3f29}' description "1. Windows 10 - Moody 2301"
}
if ($new_hash.boot2 -ne $old_hash.boot2) {
bcdedit /set '{xxxxxxxx-3af2-11ec-ac8e-666666a3f29}' description "2. Windows 10 - Altamarino 2405"
}
if ($new_hash.boot3 -ne $old_hash.boot3) {
bcdedit /set '{xxxxxxxx-3af2-11ec-ac8e-333333a3f29}' description "3. Windows 10 - Delacruz 2415"
}
if ($new_hash.boot4 -ne $old_hash.boot4) {
bcdedit /set '{xxxxxxxx-3af2-11ec-ac8e-0010183a3f29}' description "4. Windows 10 - Defreitas 2405"
}
if ($new_hash.boot5 -ne $old_hash.boot5) {
bcdedit /set '{xxxxxxxx-3af2-11ec-ac8e-7777773a3f29}' description "5. Windows 10 - Thomas 2405"
}
if ($new_hash.boot6 -ne $old_hash.boot6) {
bcdedit /set '{xxxxxxxx-3af2-11ec-ac8e-555555a3f29}' description "6. Windows 10 - Ferez 2405"
}
Notice here that the loop is gone and you're just comparing named-values in one hash to the other. I also believe you should be using not equal here instead of equal. This is the easiest approach given that for each key you are doing something different as far as the data is concerned.
Of course this wouldn't scale to 100s of entries. At that point I would resort to storing the new data in an array where each array element was perhaps your hashed data but includes the specific data needed by your bcdedit call. Then you would use a foreach to enumerate the old hash key-values. For each key you'd look for the corresponding entry in your new array. If you found it then you would compare the GUIDs and if they don't match use the data (from the new array's element) to make your call to bcdedit. It might look something like this.
foreach ($oldValue in $old_hash) {
$newElement = # find the key in the new array's elements
if ($newElement -and $newElement.id -ne $oldValue.id) {
bcdedit /set $newElement.id description $newElement.description
}
}
The thought here is that the new array is an array of objects where the objects have the value you need.
$newElements = @(@{ name="boot1"; id = "guid"; description = 'Windows 10'), @{ ... })
Of course you can build this array up dynamically if needed.