Hi @swalton
So what is happening here is the documents you want the rule to run on are not being targeted.
With This External Rule ran before save event trigger the document object is the top most document indicated by ActiveDocument. So the Parent Assembly. See Picture(1)
'create reference to part
Dim openDoc As Document = ThisApplication.ActiveDocument'ThisDoc.Document
'format display name
openDoc.DisplayName = iProperties.Value("Project", "Part Number") & " (" & iProperties.Value("Project", "Description") & ")"

With this External Rule the document ran before save event trigger the object is driven by ThisDoc.Document which works to update the iproperties of any document the event trigger is targeting. So the rule runs on save on any document that has been dirtied. See Picture(2). The document can be dirtied by adjusting the iProperty in the BOM editor or deleting the occurrence Name.
Dim openDoc As Document = ThisDoc.Document
'format display name
openDoc.DisplayName = iProperties.Value("Project", "Part Number") & " (" & iProperties.Value("Project", "Description") & ")"

Assembly7 Document Dirtied

In my testing I couldn't get any update snippets to provide any meaningful contribution so those have been omitted to avoid unnecessary updates.
Not sure if Method 2 is robust enough for your use. If not the only other solution I can think of is an external rule run manually to loop through the reference documents Of the Parent Assembly and force a change to the display name.
Dim Asm As AssemblyDocument = ThisDoc.Document
Dim Trans As Transaction = ThisApplication.TransactionManager.StartTransaction(Asm, "Change Display Name In all files") 'Make this a single transaction
For Each Doc As Document In Asm.AllReferencedDocuments 'Traverse all referenced documents
If Doc.IsModifiable = True Then
Try
Dim PartNo As String = Doc.PropertySets.Item("Design Tracking Properties").Item("Part Number").Value
Dim Description As String = Doc.PropertySets.Item("Design Tracking Properties").Item("Description").Value
'Format display name.
Doc.DisplayName = PartNo & " (" & Description & ")"
Catch
End Try
End If
Next
Trans.End 'End the transaction
If this solved a problem, please click (accept) as solution.
Or if this helped you, please, click (like)
Regards
Alan