Synchronize files didn't do the job for me with DNN 5.4.0 - the problem still exists for non-root portals.
DNN 5.4 has a new view definition, so you'll need to use the updated script below:
ALTER VIEW {databaseOwner}{objectQualifier}vw_Tabs
AS
SELECT
T.TabID,
T.TabOrder,
T.PortalID,
T.TabName,
T.IsVisible,
T.ParentId,
T.[Level],
CASE WHEN I.FileID IS NULL THEN T.IconFile
ELSE '~/' + P.HomeDirectory + '/' + I.Folder + I.FileName
END AS IconFile,
CASE WHEN L.FileID IS NULL THEN T.IconFileLarge
ELSE '~/' + P.HomeDirectory + '/' + L.Folder + L.FileName
END AS IconFileLarge,
T.DisableLink,
T.Title,
T.Description,
T.KeyWords,
T.IsDeleted,
T.SkinSrc,
T.ContainerSrc,
T.TabPath,
T.StartDate,
T.EndDate,
T.Url,
CASE WHEN EXISTS (SELECT 1 FROM {databaseOwner}{objectQualifier}Tabs T2 WHERE T2.ParentId = T.TabId) THEN 'true' ELSE 'false' END AS HasChildren,
T.RefreshInterval,
T.PageHeadText,
T.IsSecure,
T.PermanentRedirect,
T.SiteMapPriority,
CI.ContentItemID,
CI.Content,
CI.ContentTypeID,
CI.ModuleID,
CI.ContentKey,
CI.Indexed,
T.CreatedByUserID,
T.CreatedOnDate,
T.LastModifiedByUserID,
T.LastModifiedOnDate
FROM {databaseOwner}{objectQualifier}Tabs AS T
LEFT OUTER JOIN {databaseOwner}{objectQualifier}ContentItems AS CI ON T.ContentItemID = CI.ContentItemID
LEFT JOIN {databaseOwner}{objectQualifier}Portals AS P ON P.PortalID = T.PortalID
LEFT JOIN {databaseOwner}{objectQualifier}Files AS I ON I.FileID = CASE WHEN LEFT(LOWER(T.IconFile), 7) = 'fileid=' THEN CAST((RIGHT(LOWER(T.IconFile), LEN(T.IconFile) - 7)) AS int) ELSE -1 END
LEFT JOIN {databaseOwner}{objectQualifier}Files AS L ON L.FileID = CASE WHEN LEFT(LOWER(T.IconFileLarge), 7) = 'fileid=' THEN CAST((RIGHT(LOWER(T.IconFileLarge), LEN(T.IconFileLarge) - 7)) AS int) ELSE -1 END
GO