Faits:
A. Le 1er avril 1998, A._ a pris à bail un appartement de trois pièces dans un immeuble sis à Genève. Conclu pour un an, le contrat se renouvelait ensuite d'année en année, sauf résiliation signifiée trois mois avant l'échéance. Le loyer annuel, charges comprises, s'élevait à 8'232 fr.
En 2003, X._ est devenue propriétaire de l'immeuble précité.
La locataire a vécu dans l'appartement avec son fils majeur, B._, jusqu'au 1er avril 1999. A cette date, elle a quitté les lieux et sous-loué le logement à son fils. Ce dernier a épousé C._ en juillet 2003; le couple a occupé l'appartement sous-loué jusqu'à sa séparation en décembre 2004. Par jugement du 27 mai 2005, le Tribunal de première instance de Genève a, dans le cadre de mesures protectrices de l'union conjugale, attribué la jouissance exclusive du logement susmentionné à C._. L'avocat de celle-ci a communiqué la décision judiciaire à la régie représentant la bailleresse.
Par lettre du 19 août 2005, la gérance s'est étonnée auprès de A._ d'apprendre qu'elle ne semblait plus occuper le logement loué; la locataire était mise en demeure de fournir des explications, faute de quoi elle s'exposait à une résiliation du bail.
Dans sa réponse du 28 août 2005, A._ a confirmé avoir quitté l'appartement en avril 1999, le laissant à son fils à partir de cette date; elle affirmait avoir demandé alors à la régie si le bail pouvait être transféré à B._; il lui aurait été répondu que cela n'était pas nécessaire dès lors qu'il avait le droit d'habiter dans l'appartement en tant que fils de la locataire. A._ précisait que, lorsqu'elle avait appris l'attribution judiciaire du logement familial à sa belle-fille, elle avait immédiatement demandé à la gérance, par téléphone, si le bail pouvait être transféré à C._, possibilité que la régie s'était engagée à examiner.
Par pli recommandé du 7 octobre 2005, la gérance a mis A._ en demeure de réintégrer le logement sous-loué sans autorisation jusqu'au 15 novembre 2005, l'avertissant qu'à défaut, le bail serait résilié pour justes motifs. La locataire n'a pas donné suite à cette correspondance.
Par courrier recommandé et avis officiel du 23 mars 2006, X._ a résilié le bail de manière anticipée pour le 31 mai 2006.
B. Par requête déposée le 21 avril 2006, A._ a contesté le congé.
Dans une décision du 23 octobre 2006, la Commission de conciliation en matière de baux et loyers a déclaré valable le congé notifié pour le 31 mai 2006 et accordé à la locataire une prolongation unique du bail jusqu'au 31 janvier 2007.
A._ a porté la cause devant le Tribunal des baux et loyers du canton de Genève, reprenant notamment ses conclusions en annulation du congé.
Par jugement du 4 avril 2007, le Tribunal des baux et loyers a déclaré inefficace le congé notifié le 23 mars 2006.
La bailleresse a interjeté appel; elle faisait valoir notamment que la locataire n'avait aucunement l'intention de revenir vivre un jour dans l'appartement loué. Statuant le 3 mars 2008, la Chambre d'appel en matière de baux et loyers du canton de Genève a confirmé le jugement de première instance. En substance, la cour cantonale a jugé que la sous-location incriminée était admissible au regard de l'<ref-law>, dès lors qu'elle intervenait à des conditions extrêmement proches de celles du bail principal et que la bailleresse n'avait pas démontré son besoin d'attribuer le logement en cause à une autre personne que «son occupant actuel»; la bailleresse ne pouvait ainsi résilier le bail de manière anticipée sur la base de l'<ref-law>.
C. X._ forme un recours en matière civile. Elle demande que l'arrêt cantonal soit annulé et que le congé notifié le 23 mars 2006 soit déclaré valable.
Par ordonnance du 30 avril 2008, un délai au 2 juin 2008 a été imparti à A._ pour déposer une réponse éventuelle.
L'intimée a remis une écriture à la poste en date du 3 juin 2008.

Considérant en droit:
1. 1.1 Formé par la partie qui a succombé dans ses conclusions (<ref-law>), le recours est dirigé contre un jugement final (<ref-law>) rendu en matière civile (<ref-law>) par une autorité cantonale de dernière instance (<ref-law>).
La contestation porte sur la validité d'une résiliation de bail. En pareil cas, la valeur litigieuse se détermine selon le loyer dû pour la période durant laquelle le contrat subsiste nécessairement, en supposant que l'on admette la contestation, et qui s'étend jusqu'au moment pour lequel un nouveau congé aurait pu être donné ou l'a été effectivement (<ref-ruling> consid. 1 p. 149; <ref-ruling> consid. 1 p. 386). Lorsque le bail bénéficie de la protection contre les congés des <ref-law>, il convient, sauf exceptions, de prendre en considération la période de trois ans prévue à l'art. 271a al. 1 let. e CO (cf. ATF <ref-ruling> consid. 1 p. 386; arrêt 4C.264/2002 du 25 août 2003, consid. 1.1, reproduit in SJ 2004 I p. 93; sous le nouveau droit de procédure fédéral, entre autres, consid. 1.1 non publié de l'ATF 134 III xxx cause 4A_516/2007). Comme le loyer annuel du logement en cause s'élève à plus de 8'000 fr., la valeur litigieuse de 15'000 fr. exigée par l'<ref-law> pour les contestations relatives à un bail à loyer est atteinte en l'espèce.
Pour le surplus, déposé dans le délai (<ref-law>) et la forme (<ref-law>) prévus par la loi, le recours est en principe recevable.
En revanche, il n'y a pas lieu de tenir compte de la réponse de l'intimée, déposée tardivement (<ref-law>).
1.2 Le recours en matière civile peut être interjeté pour violation du droit, tel qu'il est délimité par les art. 95 et 96 LTF. En vertu de l'exception ancrée à l'<ref-law>, le Tribunal fédéral n'entre pas en matière sur la violation d'un droit de rang constitutionnel ou sur une question afférente au droit cantonal ou intercantonal si le grief n'a pas été invoqué et motivé de manière détaillée par la partie recourante. Pour le reste, il applique le droit d'office (<ref-law>), sans être limité par les arguments soulevés dans le recours ni par la motivation retenue dans la décision attaquée; il peut donc admettre un recours pour d'autres motifs que ceux qui ont été articulés ou, à l'inverse, rejeter un recours en substituant une nouvelle argumentation à celle de l'autorité précédente. Cependant, compte tenu de l'exigence de motivation contenue à l'art. 42 al. 1 et 2 LTF, sanctionnée par l'irrecevabilité des recours dont la motivation est manifestement insuffisante (<ref-law>), le Tribunal fédéral n'examine en principe que les griefs invoqués; il n'est donc pas tenu de traiter, comme le ferait une autorité de première instance, toutes les questions juridiques qui se posent, lorsque celles-ci ne sont plus discutées devant lui (<ref-ruling> consid. 1.1 p. 104/105).
1.3 Le Tribunal fédéral conduit son raisonnement juridique sur la base des faits établis par l'autorité précédente (<ref-law>). Il ne peut s'en écarter que si les faits ont été établis de façon manifestement inexacte ou en violation du droit au sens de l'<ref-law> (<ref-law>). La partie recourante qui entend s'écarter des constatations de l'autorité précédente doit expliquer de manière circonstanciée en quoi les conditions d'une exception prévue par l'<ref-law> seraient réalisées, faute de quoi il n'est pas possible de tenir compte d'un état de fait qui diverge de celui contenu dans la décision attaquée (cf. <ref-ruling> consid. 1.4.3; <ref-ruling> consid. 1.4). Aucun fait nouveau ni preuve nouvelle ne peut être présenté à moins de résulter de la décision de l'autorité précédente (<ref-law>).
1.4 Le Tribunal fédéral ne peut aller au-delà des conclusions des parties (<ref-law>). Toute conclusion nouvelle est irrecevable (<ref-law>).
2. La recourante reproche aux juges cantonaux d'avoir violé les art. 257f al. 3 et 262 CO en ne reconnaissant pas son droit de résilier le bail de manière anticipée en raison d'une sous-location non autorisée présentant des inconvénients majeurs. A cet égard, elle fait valoir que la locataire n'a manifestement pas l'intention de revenir vivre un jour dans l'appartement loué, comme le démontre en particulier le fait qu'elle a demandé le transfert du bail à sa belle-fille. La sous-location tendrait ainsi à une substitution détournée de locataire. Il s'agirait là d'un inconvénient majeur au sens de l'art. 262 al. 2 let. c CO, qui aurait permis à la bailleresse de s'opposer à la sous-location si son consentement avait été requis. La recourante relève également que la locataire n'a pas répondu à l'avertissement adressé par la régie lorsque celle-ci a eu connaissance de la sous-location. Cette absence de réaction suffirait déjà à fonder une résiliation du bail sur la base de l'<ref-law>.
2.1 A titre liminaire, il convient de préciser que, si elle a bien sous-loué l'appartement en cause à son fils, la locataire n'a pas, selon les constatations cantonales, conclu par la suite un contrat de sous-location avec sa belle-fille. C._ occupe le logement litigieux en tant qu'épouse du sous-locataire. Le jugement sur mesures protectrices de l'union conjugale a certes attribué le logement à la belle-fille de l'intimée sur la base de l'<ref-law>, mais il n'a pas modifié la relation contractuelle entre locataire et sous-locataire (cf. Deschenaux/Steinauer/Baddeley, Les effets du mariage, n. 719 et 721, p. 300). Ce n'est qu'en cas de divorce que le juge peut attribuer à l'un des conjoints les droits et obligations résultant du (sous-)bail (cf. <ref-law>).
Par ailleurs, il n'est pas contesté que la sous-location litigieuse n'a pas été autorisée, la locataire n'ayant pas informé la bailleresse à ce sujet. Cette constatation du jugement de première instance n'est pas remise en cause dans l'arrêt cantonal, qui part bien de la prémisse selon laquelle la sous-location débutant le 1er avril 1999 a été «effectuée sans autorisation préalable du bailleur».
2.2 Le congé litigieux est fondé sur l'<ref-law>. Cette disposition permet notamment au bailleur de résilier un bail d'habitation dans un délai de trente jours pour la fin d'un mois lorsque le locataire, malgré un avertissement écrit, persiste à enfreindre son devoir de diligence de manière à rendre le maintien du bail insupportable pour son cocontractant ou les habitants de l'immeuble.
Dans un arrêt récent destiné à la publication, le Tribunal fédéral a rappelé qu'une sous-location sans le consentement du bailleur - notamment lorsque le locataire s'abstient de demander l'autorisation de sous-louer - pouvait justifier une résiliation anticipée du bail selon l'<ref-law>. Le seul fait de ne pas requérir le consentement du bailleur ne suffit toutefois pas à justifier un congé anticipé, sans avertissement préalable. Pour respecter la condition de la protestation prescrite à l'<ref-law>, le bailleur qui apprend que l'objet remis à bail est sous-loué sans son consentement, doit inviter le locataire, par écrit, à se conformer aux exigences légales, en l'enjoignant à mettre un terme à la sous-location ou en protestant contre l'absence de demande d'autorisation. Si le bailleur choisit la première injonction, le preneur a tout de même la possibilité de requérir le consentement de son cocontractant, qui peut être donné après coup. Si le locataire ne réagit pas à l'avertissement écrit du bailleur, un congé anticipé sera fondé, en tout cas, lorsqu'un examen rétrospectif des faits permet de conclure que le bailleur aurait disposé d'un motif valable au sens de l'<ref-law> pour s'opposer à la sous-location. Dans ce cas, l'exigence du caractère insupportable du maintien du contrat pour le bailleur posée à l'<ref-law> n'a pas de portée indépendante (arrêt 4A_516/2007 du 6 mars 2008, consid. 3.1 et 3.2).
2.3 En l'espèce, la bailleresse, représentée par la gérance, a protesté contre la sous-location non autorisée une première fois dans sa lettre du 19 août 2005, puis par le pli recommandé du 7 octobre 2005 mettant en demeure la locataire de réintégrer le logement loué. L'intimée n'a pas réagi à cette dernière missive. Le 28 août 2005, elle avait répondu à la première mise en demeure en admettant avoir sous-loué l'appartement à son fils à partir du 1er avril 1999 et en précisant avoir demandé à la régie le transfert du bail à sa belle-fille lorsqu'elle avait pris connaissance du jugement sur mesures protectrices de l'union conjugale. En revanche, la locataire n'a pas requis, après coup, le consentement de la bailleresse pour la sous-location à son fils; elle n'a pas non plus demandé l'autorisation préalable de sous-louer dorénavant l'appartement à sa belle-fille. Il s'avère ainsi qu'au moment où la résiliation anticipée a été signifiée, la recourante avait protesté valablement par écrit contre la sous-location non autorisée et que la locataire n'avait pas mis fin à cette sous-location, ni même demandé le consentement a posteriori de la bailleresse.
2.4 Examinant si la recourante aurait été en droit de s'opposer à la sous-location, la cour cantonale a nié l'existence d'inconvénients majeurs pour la bailleresse au motif que celle-ci n'avait pas démontré un besoin d'attribuer le logement en cause à une autre personne que le sous-locataire actuel. La question n'est toutefois pas là, dès lors que la recourante faisait valoir, à titre d'inconvénient majeur, l'absence de volonté de l'intimée de réintégrer un jour le logement loué. Or, ce point est juridiquement pertinent. En effet, si le locataire a perdu toute idée de reprendre un jour l'usage de la chose louée et qu'il a procédé en réalité à une substitution de locataires par la voie détournée de la sous-location, il y a abus de droit (<ref-law>) et le preneur ne saurait se prévaloir de son droit de sous-louer (cf. arrêt 4C.199/1994 du 11 octobre 1994, consid. 4c, reproduit in SJ 1995 p. 227; arrêt 4C.124/1999 du 6 octobre 1999, consid. 4a, b et c; arrêt 4C.155/2000 du 30 août 2000, consid. 2b et c, reproduit in SJ 2001 I p. 17).
2.5 A l'époque de la résiliation, l'intimée sous-louait l'appartement à son fils depuis près de sept ans. Dans sa réponse du 28 août 2005 à la régie, elle déclare avoir demandé à celle-ci, au moment où elle a quitté le logement en avril 1999, le transfert du bail à B._. Dans la même lettre, elle précise que, lorsqu'elle a appris l'attribution judiciaire du logement à sa belle-fille, elle a tout de suite demandé à la gérance si le bail pouvait être transféré à C._.
Le transfert de bail et la sous-location se distinguent notamment par une intention différente du locataire. Par la sous-location, le locataire veut toujours revendiquer l'usage de la chose et disposer de son droit d'usage alors que, par le transfert, il veut au contraire remettre son droit d'usage à un tiers et se libérer en même temps du bail (arrêt précité du 6 octobre 1999, consid. 4a). Ainsi, lorsqu'elle prétend avoir demandé le transfert du bail à son fils, puis à sa belle-fille, la locataire démontre que son intention n'était pas de réintégrer un jour ou l'autre l'appartement en cause, mais bien de se libérer définitivement des obligations résultant du bail. Comme aucun transfert du bail, avec l'accord de la bailleresse, n'a eu lieu, la sous-location à B._, représenté ensuite par son épouse, consistait en réalité pour la locataire à laisser indéfiniment l'usage de la chose louée à un membre de sa famille. Ce faisant, l'intimée a utilisé la sous-location dans un but qui lui est étranger, soit la substitution de locataires. Or, lorsqu'un preneur voit son bail résilié de manière anticipée en raison d'une sous-location non autorisée, il ne saurait contester le congé en se prévalant d'un droit de sous-louer exercé en violation des règles de la bonne foi. En d'autres termes, la bailleresse aurait pu, en l'espèce, s'opposer à une sous-location utilisée dans un but - illégitime - de substitution de locataires. Il s'ensuit que la résiliation anticipée signifiée le 23 mars 2006 pour le 31 mai 2006 est valable.
3. Sur le vu de ce qui précède, les conclusions du recours doivent être entièrement admises. Il n'est dès lors pas nécessaire d'examiner le grief par lequel la recourante reproche à la cour cantonale d'avoir omis de prendre en compte trois faits pertinents, dûment établis par pièce.
Par ailleurs, la réforme de l'arrêt attaqué dans le sens demandé par la recourante commande de modifier la répartition des frais de la procédure cantonale, qui seront supportés par l'intimée (<ref-law>).
4. Comme le recours est admis, les frais judiciaires seront mis à la charge de l'intimée (<ref-law>), laquelle versera également des dépens à la recourante (art. 68 al. 1 et 2 LTF).

Par ces motifs, le Tribunal fédéral prononce:
1. Le recours est admis et l'arrêt attaqué est annulé.
La résiliation du bail notifiée le 23 mars 2006 par X._ à A._ en rapport avec un appartement de trois pièces dans l'immeuble sis à Genève, est valable.
2. Les frais de la procédure cantonale par 300 fr. sont mis à la charge de l'intimée.
3. Les frais judiciaires, arrêtés à 2'000 fr., sont mis à la charge de l'intimée.
4. L'intimée versera à la recourante une indemnité de 2'500 fr. à titre de dépens.
5. Le présent arrêt est communiqué aux parties et à la Chambre d'appel en matière de baux et loyers du canton de Genève.
Lausanne, le 24 juin 2008
Au nom de la Ire Cour de droit civil
du Tribunal fédéral suisse
Le Président: La Greffière:
Corboz Godat Zimmermann