Faits : A. A._, ressortissant portugais, arrêté le 18 mars 2014, se trouve en détention provisoire, sous la prévention de violation grave de la LStup (art. 19 al. 2 LStup). Il lui est reproché d'avoir acquis pour son compte à Genève, en l'espace d'à peu près une année, l'équivalent de 4 kg 150 d'héroïne et d'en avoir fait revendre par B._ environ 1 kg. Le prénommé nie les faits. Par ordonnance du 21 mars 2014, le Tribunal des mesures de contrainte du canton du Valais (Tmc) a ordonné la détention de A._ pour une durée de trois mois. Par la suite, la détention a été régulièrement prolongée, en dernier lieu jusqu'au 29 décembre 2014, par ordonnance du 29 septembre 2014 du Tmc. A._ a recouru contre cette ordonnance auprès de la Chambre des recours pénale du Tribunal cantonal du canton du Valais (ci-après: le Tribunal cantonal), qui a rejeté ce recours par ordonnance du 29 octobre 2014. Le Tribunal cantonal a considéré en substance qu'il existait de forts soupçons de culpabilité ainsi qu'un risque concret de fuite. Il a en outre jugé que le principe de la célérité était respecté, tout en constatant un "fléchissement dans l'avancement de la cause durant l'été". B. Agissant par la voie du recours en matière pénale, A._ demande principalement au Tribunal fédéral d'annuler l'ordonnance attaquée et d'ordonner sa libération immédiate. A titre subsidiaire, il requiert sa libération assortie de différentes mesures de substitution (obligation de se présenter à la police cantonale, saisie de sa carte d'identité, assignation à résidence - horaires de travail exceptés -, obligation d'avoir un travail régulier, obligation de continuer son traitement médical, interdiction d'entretenir des relations avec toute personne touchée par la présente procédure). Il conclut très subsidiairement au renvoi de la cause à la juridiction cantonale pour détermination des mesures de substitution applicables. Il requiert en outre l'assistance judiciaire. Invitée à se déterminer, la cour cantonale se réfère aux considérants de son ordonnance. Le procureur en charge de la cause ne s'est pas déterminé.