Faits :
A.
A._, née en 1992, de nationalité marocaine, est arrivée en Suisse en 2015 avec un visa pour suivre des études dans le canton du Valais. Admise en filière bachelor en énergie et techniques environnementales auprès de la Haute Ecole Spécialisée de Suisse occidentale à Sion (ci-après: la Haute Ecole du Valais), elle a été mise au bénéfice d'une autorisation de séjour pour études, renouvelée jusqu'au 20 juillet 2017. En situation d'échec définitif, A._ a sollicité, le 31 juillet 2017, la prolongation de son autorisation de séjour, en faisant part de son intention d'entreprendre une formation passerelle de webmaster, afin d'intégrer la filière informatique de gestion de la Haute Ecole du Valais. Par décision du 13 septembre 2017, le Service de la population et des migrations du canton du Valais (ci-après: le Service cantonal valaisan) a refusé de prolonger l'autorisation de séjour de A._ et a prononcé son renvoi de Suisse, avec un délai de départ au 20 octobre 2017. Cette décision, non contestée, est entrée en force.
B.
Le 16 septembre 2017, A._ est arrivée dans le canton de Neuchâtel (cf. <ref-law>). Le 29 septembre 2017, elle a déposé dans ce canton une demande d'autorisation de séjour pour études, afin d'effectuer un bachelor en informatique de gestion auprès de la Haute Ecole ARC (HE-ARC) à Neuchâtel (ci-après: la Haute Ecole de Neuchâtel). Le 11 octobre 2017, A._ a annoncé son arrivée au contrôle des habitants de Neuchâtel.
Par décision du 21 novembre 2017, le Service des migrations du canton de Neuchâtel (ci-après: le Service cantonal neuchâtelois) a refusé d'entrer en matière sur la demande d'autorisation de séjour pour études de A._. Celle-ci a formé un recours auprès du Département de l'économie et de l'action sociale du canton de Neuchâtel (ci-après: le Département), qui l'a rejeté par décision du 25 juin 2019.
Par arrêt du 28 novembre 2019, la Cour de droit public du Tribunal cantonal de la République et canton de Neuchâtel (ci-après: le Tribunal cantonal) a rejeté le recours de A._ contre ce prononcé et refusé l'octroi de l'assistance judiciaire. En substance, le Tribunal cantonal a confirmé le refus d'entrer en matière en retenant que les autorités neuchâteloises ne pouvaient pas examiner la demande d'autorisation de séjour pour études déposée devant elles, compte tenu de la décision des autorités valaisannes du 13 septembre 2017 refusant à A._ un titre de séjour pour une formation dans le canton du Valais.
C.
Contre l'arrêt du 28 novembre 2019, A._ forme un recours constitutionnel subsidiaire. Elle demande au Tribunal fédéral d'annuler l'arrêt querellé et de renvoyer la cause au Tribunal cantonal pour qu'il statue sur les dépens cantonaux et rende une nouvelle décision dans le sens des considérants. Elle requiert le bénéfice de l'assistance judiciaire et la désignation de son conseil pour la défense de ses intérêts.
Le Tribunal cantonal se réfère aux motifs de son arrêt et conclut au rejet du recours. Le Service cantonal neuchâtelois et le Département concluent au rejet du recours, dans la mesure où il est recevable. Le Secrétariat d'Etat aux migrations a renoncé à déposer des observations.

Considérant en droit :
1.
1.1. D'après l'art. 83 let. c ch. 2 LTF, le recours en matière de droit public est irrecevable contre les décisions en matière de droit des étrangers qui concernent une autorisation à laquelle ni le droit fédéral, ni le droit international ne donnent droit. En raison de sa formulation potestative, l'art. 27 LEI (RS 142.20), qui concerne l'admission en Suisse des étrangers en vue d'une formation ou d'une formation continue, ne confère aucun droit à celui qui s'en prévaut (arrêt 2D_68/2014 du 30 juin 2015 consid. 2.1).
Le présent litige porte sur la confirmation du refus d'entrer en matière du Service cantonal neuchâtelois sur une demande d'autorisation de séjour en vue de suivre une formation dans le canton de Neuchâtel. Partant, le recours en matière de droit public est exclu en l'espèce. C'est donc à juste titre que la recourante a formé un recours constitutionnel subsidiaire (<ref-law>).
1.2. A qualité pour former un recours constitutionnel subsidiaire quiconque a pris part à la procédure devant l'autorité précédente ou a été privé de le faire (<ref-law>) et a un intérêt juridique à l'annulation ou à la modification de la décision attaquée (<ref-law>). Selon la jurisprudence, lorsque, comme en l'espèce, une partie recourante ne dispose pas d'un droit à obtenir une autorisation de séjour et partant n'a pas une position juridique protégée qui lui confère la qualité pour agir au fond (<ref-ruling> consid. 3.3 p. 388; <ref-ruling> consid. 6.1 p. 197 s.), elle ne peut se plaindre par la voie du recours constitutionnel subsidiaire que de la violation de ses droits de partie et ce pour autant que, par ce biais, elle n'invoque pas, même indirectement, des moyens ne pouvant être séparés du fond (<ref-ruling> consid. 3.1.1 p. 130; <ref-ruling> p. 437; <ref-ruling> consid. 6.2 p. 198 s.; arrêts 2D_39/2018 du 18 décembre 2019 consid. 1.2; 2C_988/2019 du 26 novembre 2019 consid. 4; 2D_47/2019 du 13 novembre 2019 consid. 1.2).
En l'occurrence, la recourante, destinataire de l'arrêt attaqué, se plaint uniquement de la violation de l'art. 29 Cst. Son grief est partant recevable.
1.3. Pour le surplus, le recours, dirigé contre une décision finale (art. 117 et 90 LTF) rendue en dernière instance cantonale par une autorité judiciaire supérieure (art. 114 et 86 al. 1 let. d et al. 2 LTF), a été déposé en temps utile compte tenu des féries (art. 46 al. 1 let. c, 117 et 100 al. 1 LTF) et dans les formes requises (<ref-law>). Il convient donc d'entrer en matière.
2.
Le recours constitutionnel subsidiaire peut être formé pour violation des droits constitutionnels (<ref-law>). Une exigence de motivation accrue prévaut pour la violation des droits constitutionnels (cf. <ref-law>, par le renvoi de l'<ref-law>). Selon le principe d'allégation, la partie recourante doit en effet expliquer de façon circonstanciée en quoi consiste la violation dont elle se prévaut (<ref-ruling> consid. 5.1 p. 41; <ref-ruling> consid. 1.3 p. 30).
3.
La recourante dénonce une violation de son droit d'être entendue et un déni de justice formel (art. 29 Cst.). Elle fait valoir que les autorités neuchâteloises avaient l'obligation d'examiner sa demande d'autorisation de séjour en vue de suivre une formation dans le canton de Neuchâtel. Selon elle, elles ne pouvaient pas refuser d'entrer en matière au motif que les autorités d'un autre canton avaient rendu une décision négative à propos d'une autre demande d'autorisation de séjour en vue de suivre une autre formation.
3.1. Aux termes de l'art. 29 al. 1 Cst., toute personne a droit, dans une procédure judiciaire ou administrative, à ce que sa cause soit traitée équitablement et jugée dans un délai raisonnable. Il y a déni de justice formel lorsqu'une autorité n'applique pas ou applique d'une façon incorrecte une règle de procédure, de sorte qu'elle ferme l'accès à la justice au particulier qui, normalement, y aurait droit. L'autorité qui se refuse à statuer, ou ne le fait que partiellement, viole l'art. 29 al. 1 Cst. (<ref-ruling> consid. 3.1 p. 192).
3.2. En l'espèce, le Tribunal cantonal a estimé que le Département avait à bon droit confirmé le refus d'entrer en matière du Service cantonal neuchâtelois sur la demande d'autorisation de séjour déposée par la recourante, en se fondant sur les principes applicables à l'examen des demandes de reconsidération de décisions entrées en force. Il a notamment souligné que, selon la jurisprudence, indépendamment du fait qu'une demande s'intitule reconsidération ou nouvelle demande, elle ne saurait avoir pour conséquence de remettre continuellement en question des décisions entrées en force et qu'il était en principe exigé, pour qu'il soit entré en matière sur ce type de demande, que la personne ait respecté l'ordre qui lui était donné de quitter la Suisse (cf. arrêt 2C_862/2018 du 15 janvier 2019 consid. 3.1; 2C_790/2017 du 12 janvier 2018 consid. 2.4). Selon le Tribunal cantonal, la demande de la recourante devant les autorités neuchâteloises constituait une demande de reconsidération de la décision du Service cantonal valaisan refusant la prolongation de l'autorisation de séjour dans le canton du Valais et les conditions pour entrer en matière sur ce type de requêtes n'étaient pas réunies. En particulier, selon le Tribunal cantonal, il n'y avait pas de circonstances nouvelles et la recourante n'avait pas le droit à une décision, dès lors qu'elle se trouvait en situation irrégulière en Suisse.
3.3. Une demande de reconsidération est une requête adressée à l'autorité qui a rendu une décision en vue d'obtenir la modification ou l'annulation de celle-ci (cf. THIERRY TANQUEREL, Manuel de droit administratif, 2 e éd. 2018, n. 1414 p. 489; DUBEY/ZUFFEREY, Droit administratif général, Bâle 2014, n. 2135, p. 748). Indépendamment du fait qu'elle s'appelle « nouvelle demande » ou demande de reconsidération, cette requête a ainsi pour caractéristique d'avoir le même objet qu'une précédente procédure et de s'adresser à la même autorité que celle qui a rendu la décision dans cette précédente procédure.
3.4. En l'occurrence, il n'est pas contesté que c'est la première fois que la recourante sollicite une décision des autorités neuchâteloises relatives à un droit de séjour en vue de suivre une formation dispensée par la Haute Ecole de Neuchâtel.
On ne saurait par ailleurs considérer que la demande de la recourante adressée au Service cantonal neuchâtelois est une demande de reconsidération au motif de l'existence de la décision du 13 septembre 2017 rendue par le Service cantonal valaisan, puisque cette décision n'a pas été rendue par la même autorité et ne portait pas sur le même objet. Il s'agissait en effet d'une prolongation d'autorisation de séjour dans le canton du Valais demandée en vue de la poursuite d'une formation passerelle dispensée à la Haute Ecole du Valais, alors que la recourante demande aux autorités neuchâteloises une autorisation de séjour dans ce canton pour suivre une formation bachelor auprès de la Haute Ecole de Neuchâtel.
C'est partant à tort que le Tribunal cantonal a confirmé le refus d'entrer en matière sur la demande d'autorisation de séjour de la recourante en se fondant sur les principes applicables à la reconsidération des décisions. Au reste, il est manifestement inexact (cf. <ref-law>) d'indiquer, comme il l'a fait, que la recourante se trouvait en situation irrégulière en Suisse lorsqu'elle a déposé sa demande, dès lors que, selon la décision du Service cantonal valaisan du 13 septembre 2017, elle avait jusqu'au 20 octobre 2017 pour quitter la Suisse et qu'elle a déposé sa demande à Neuchâtel le 29 septembre 2017. Enfin, il est précisé que le fait que la décision des autorités valaisannes puisse avoir une incidence dans l'examen de la demande d'autorisation de séjour de la recourante dans le canton de Neuchâtel est une question qui relève du fond et qui n'est pas propre à justifier la non-entrée en matière.
3.5. Sur le vu de ce qui précède, le Tribunal cantonal a commis un déni de justice en confirmant le refus d'entrer en matière des autorités sur la demande d'autorisation de séjour de la recourante. Le recours doit être admis et l'arrêt attaqué annulé. Il convient de renvoyer la cause au Service cantonal neuchâtelois (cf. <ref-law> applicable par le renvoi de l'<ref-law>), afin qu'il se prononce, au fond, sur la demande d'autorisation de séjour de la recourante, dans une décision susceptible de recours.
4.
Le canton de Neuchâtel, dont l'intérêt patrimonial n'est pas en cause, est exonéré du paiement des frais judiciaires (<ref-law>). En revanche, il supportera les dépens de la recourante, qui obtient gain de cause avec l'aide d'un mandataire professionnel (<ref-law>). La demande d'assistance judiciaire est ainsi sans objet.
La cause est renvoyée au Tribunal cantonal pour qu'il procède à une nouvelle répartition des frais et dépens de la procédure qui s'est déroulée devant lui (art. 67 et 68 al. 5 LTF).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est admis. L'arrêt du 28 novembre 2019 du Tribunal cantonal est annulé.
2.
La cause est renvoyée au Service des migrations du canton de Neuchâtel pour qu'il entre en matière sur la demande d'autorisation de séjour de la recourante et rende une décision.
3.
Il n'est pas perçu de frais judiciaires.
4.
Le canton de Neuchâtel versera à la recourante la somme de 2'500 fr. à titre de dépens pour la procédure devant le Tribunal fédéral.
5.
La cause est renvoyée au Tribunal cantonal pour qu'il statue à nouveau sur le sort des frais et dépens de la procédure devant lui.
6.
Le présent arrêt est communiqué au mandataire de la recourante, au Service des migrations, au Département de l'économie et de l'action sociale et au Tribunal cantonal de la République et canton de Neuchâtel, Cour de droit public, ainsi qu'au Secrétariat d'Etat aux migrations.
Lausanne, le 2 avril 2020
Au nom de la IIe Cour de droit public
du Tribunal fédéral suisse
Le Président : Seiler
La Greffière : Kleber