That is doing a select from b for every record in A and the select is a serial read across B looking for the match
1000 records in A and 1000 records in B results in 1,000,000 read and compares.
If acctid is a key every update will also result in a change to the index and substring is necessarily inefficient.
Most of the wways to optimise this would generate a new table and possibly restructure the existing one
For instance add a column vendidsuffix allowed null to A
Then
Update A set Vendidsuffix = Substring(Vendid,5,4)
Then put indexes on vendid in B and vendidsuffix in A would speed things up some, then you could drop the added column.
Where clause is then A.Vendidsuffix = B.vendid
No substring function and the indexes will be
used instead of traversing the entire table
Some query optimisers would build temporay indexes for the lifetime of the update statement if that worked out 'best'
Another thing you could try is build a new version of the A table with
Select B.acctid, A.Vendid,......
Into NewA
From A,B
Where Substring(A.VendId,5,4) = B.VendId4
You could popin teh vendidsiffix column and indexes again to improve things.
Drop A rename A2 and add any indexes, constraints etc.
Or Truncate A and
Insert into A, select * From NewA
When looking at this sort of thing imagine you were doing it manually with print outs of the data. What would you have to do?