Fill in NULL values with those from another another table
First you need to relate the first empty PIN in Employees with the first PIN in PINs, the second empty PIN with the second available PIN and so on. Then you will be able to use an update with a join and populate the rows thus related.

One way is to assign row numbers to both sets and use the row numbers as the joining criterion. As MySQL does not support the standard SQL ROW_NUMBER() analytical function, you have to do without it.

One alternative is to assign the row numbers with the help of a variable, like this:

SELECT
  s.EmployeeID,
  @r := @r + 1 AS RowNumber
FROM
  (SELECT @r := 0) AS x
  CROSS JOIN
  (
    SELECT
      EmployeeID
    FROM
      Employees
    WHERE
      PIN IS NULL
    ORDER BY
      EmployeeID ASC
  ) AS s
;


The above produces a row set containing employee IDs and corresponding row numbers. Store the resulting set as a temporary mapping table and do the same for the PINs table, unless its PinID column already is a row number column. Based on your comment to Thronk's answer that the PINs table is imported from Excel, I am going to assume that the values in PinID have indeed been generated in Excel as row numbers essentially.

So, after you save the mapping set like this:

CREATE TEMPORARY TABLE Mapping
AS
SELECT
  s.EmployeeID,
  @r := @r + 1 AS PinID
FROM
  (SELECT @r := 0) AS x
  CROSS JOIN
  (
    SELECT
      EmployeeID
    FROM
      Employees
    WHERE
      PIN IS NULL
    ORDER BY
      EmployeeID ASC
  ) AS s
;


you can use it in the UPDATE statement like this:

UPDATE
  Employees AS e
  INNER JOIN Mapping AS m ON e.EmployeeID = m.EmployeeID
  INNER JOIN PINs AS p ON m.PinID = p.PinID
SET
  e.PIN = p.PIN
;


You can play with this method at Rextester.