1/ Un BOOL, logiquement, ça prends 1 bit. Par contre, SQL Server ne sait pas faire un champ de 1 bit, c'est juste le type byte (8 bits) qui est surchargé avec deux valeurs possibles. Donc, ça fera 270 000 * 6 octets de plus, soit 1,6 Mo de plus. C'est donc pas une perte de données importante. En revanche, regarde dans tes requêtes si tu fais des jointures droites pour récupérer les booléens à partir de la table parente. Si c'est le cas, alors il y a une grosse perte de performance par rapport à tout fusionner. Je pense donc que la fusion des deux tables une solution tout à fait envisageable.
2/ Tout dépend si le champ est indexé ou non. Si c'est le cas, alors il n'y aura pas de différence significative de perfs significative entre un type entier et un varchar. Choisi donc le type en fonction de ton besoin, l'aspect performance pouvait être mis de côté.
PS: dans ce cas, évite un maximum de faire des CAST(id as number) à tout bout de champ, parceque :
a/ L'index ne sera plus utilisable
b/ La conversion de type est très lente, donc tu vas perdre énormément de temps !