(Latest QGIS versions have issues with Virtual Layer)
Virtual Layer with below syntax:
SELECT grid.*, nodes.id
FROM grid, nodes
WHERE st_touches(grid.geometry, nodes.geometry) = 1 -- (1)
st_x(nodes.geometry)-st_x(st_centroid(grid.geometry)) < 0 -- (2)
st_y(nodes.geometry)-st_y(st_centroid(grid.geometry)) > 0 -- (3)
The idea is really simple. As you need northwest corner, the x coordinate at the vertex is less, while the y is greater, than the centroid of the polygon.
(1) This helps to choose touching four corner points around each polygon.
(2) x-difference (dx) between the anticipated node and the centroid becomes negative.
(3) y-difference (dy) between the anticipated node and the centroid becomes positive.
So, if you want to find NE corner, (2) should be