UPDATE, subquery with SELECT TOP
I don't see any issues with your query, regarding correctness of the update.

Another way to get the same results, using window functions.

Regarding efficiency, you'll need to check execution plans and test both methods.

UPDATE a
SET a.best_seller = b.book_id
FROM authors AS a
  JOIN
  ( SELECT author_id, book_id,
           rn = ROW_NUMBER() OVER (PARTITION BY author_id
                                   ORDER BY copies_sold DESC)
    FROM books
  ) AS b
  ON  b.author_id = a.author_id
  AND b.rn = 1 ;