Un solo comando SQL basado en conjuntos es mucho más eficiente que hacer un bucle:
UPDATE words_social w
SET social = (iu->>'social')::int
FROM JSONB_ARRAY_ELEMENTS(in_users) iu -- in_user = function variable
WHERE w.sid = iu->>'sid'; -- type of sid?
Para responder a su pregunta original:
Porque estabas tratando de convertir el jsonb valor a integer . En su solución ya descubrió que necesita el ->> operador en lugar de -> para extraer text , que se puede convertir a integer .
Su segundo intento agregó un segundo error:
t->'social'::int
Además de lo anterior:precedencia de operadores . El operador de conversión :: se une más fuerte que el operador json -> . Como ya te encontraste, realmente quieres:
(t->>'social')::int
Caso muy similar en dba.SE: