Bad classification performance of logistic regression on imbalanced data in testing as compared to training
I suspect the reason is that the class balance in your test set is different from the class balance in your training set.  That will throw everything off.  The fundamental assumption made by statistical machine learning methods (including logistic regression) is that the distribution of data in the test set matches the distribution of data in the training set.  SMOTE can throw that off.

It sounds like you have used SMOTE to augment the training set by adding additional synthetic positive instances (i.e., oversampling the minority class) -- but you haven't added any negative instances.  So, the class balance in the training set might have shifted from 0.5%/99.5% to something like (say) 10%/90%, while the class balance in the test set remains 0.5%/99.5%.  That's bad; it will cause the classifier to over-predict positive instances.  For some classifiers, it's not a major problem, but I expect that logistic regression might be more sensitive to this mismatch between training distribution and test distribution.

Here are two candidate solutions for the problem that you can try:


Stop using SMOTE.  Ensure the training set has the same distribution as the test set.  SMOTE might actually be unnecessary in your situation.
Continue to augment the training set using SMOTE as you're currently doing, and compensate for the train/test mismatch by shifting the threshold for classification.  Logistic regression produces an estimated probability that a particular instance is from the positive class.  Typically, you then compare that probability to the threshold 0.5 and use that to classify it as positive or negative.  You can adjust the threshold to correct for that: replace $0.5$ with $0.5/k$, where $k$ is the ratio of positives in your training set after augmentation to positive before (e.g., if augmentation shifted the training set from 0.5%/99.5% to 10%/90%, then $k=10/0.5=20$); or you can use cross-validation to find a suitable threshold that maximizes the F1 score (or some other metric).


Incidentally, I recommend you make sure to use regularization with your logistic regression model, and use cross-validation to select the regularization hyper-parameter.  There's nothing wrong with 15K features if you have 120K instances in your training set, but you might want to regularize it strongly (choose a large regularization parameter) to avoid overfitting.

Finally, understand that dealing with severe class imbalance such as you have is just hard.  Fortunately, there are many techniques available.  Do some reading and research (including on Stats.SE) and you should be able to find other methods you could try, if these don't work well enough.