It’s not too bad and I think it’s important not to clear other attributes. Here’s a small change to your script:
Get-ChildItem -Recurse -Force -Attributes 'Archive' | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-30) } | ForEach-Object { $_ | Set-ItemProperty -Name Attributes -Value ($_.Attributes -bxor 'Archive') }
It is also more efficient to have the check for Archive attribute in the Get-ChildItem command itself, so there are less objects to send through the pipeline.