Suppose the Tic Tac Toe board is like this:
\begin{array}{c|c|c}
1 & 2 & 3 \\ \hline
4 & 5 & 6 \\ \hline
7 & 8 & 9
\end{array}
and I define a predicate row1-win by:
$$ X(1) \wedge X(2) \wedge X(3) \Rightarrow \mbox{row1-win} $$
meaning the first row have all three X's.
Now I want to define another predicate row1-can-win which means that player X is one move away from winning row1, specifically by playing X(1). It describes this situation:
\begin{array}{c|c|c}
& X & X \\ \hline
* & * & * \\ \hline
* & * & *
\end{array}
but I want to re-use the predicate row1-win. So I say:
$$ \bigg ( X(1) \Rightarrow \mbox{row1-win} \bigg ) \Rightarrow \mbox{row1-can-win} $$
meaning that "If the assumption that X(1) is played implies row1-win, then this implies row1-can-win".
But it doesn't quite work because, whenever square 1 is empty, X(1) would be False, and the inner $\Rightarrow$ would be True, making the overall conclusion also True, regardless of what are in squares 2 and 3. This is not the intended meaning, which requires X(2) and X(3) be True.
What has gone wrong with this formulation?
I think the problem is that the first $\Rightarrow$ may be wrong in the sense that it should not be interpreted as "material implication", but instead the notion of "strict implication" should be used. The latter requires modal logic, ie, "A strictly implies B" is equivalent to $\square (A \Rightarrow B)$, meaning "A implies B necessarily".
Is my thinking correct? Is there a way to express this using classical propositional logic only?
This feels more like a programming question than a math question, but I will try to help anyway.
The main issue is that there are two different interpretations of $X(1)$ in your formulation.
When you define $\operatorname{row1-win}$ by $X(1) \wedge X(2) \wedge X(3) \implies \operatorname{row1-win}$, $X(1)$ here means "in the current state of the board, box $1$ has an $X$".
When you define $\operatorname{row1-can-win}$ by $(X(1) \implies \operatorname{row1-win}) \implies \operatorname{row1-can-win}$, $X(1)$ here means "in the scenario where I fill box $1$ with an $X$".
Allow me to propose an alternate formulation that works. Code your Tic-Tac-Toe board by functions $f : \{1,2,3,4,5,6,7,8,9\} \to \{0,X,O\}$. The initial state is such that $f(n) = 0$ for all $n = 1,\dots,9$.
Now define two functions $\operatorname{Add-X}$ and $\operatorname{Add-O}$ as follows: For $\operatorname{Add-X}$, it takes in a function $f$ and a value $n = 1,\dots,9$, such that: $$ \operatorname{Add-X}(f,n)(m) = \begin{cases} X, &\text{if $m = n$} \\ f(m), &\text{if $m \neq n$} \\ \end{cases} $$ I.e. we add an $X$ to box $n$ (I'm assuming that it is legal to add an $X$ to box $n$). $\operatorname{Add-O}$ can be defined similarly.
Now you can define the predicates in your question as follows: $\operatorname{row1-win}$ shall be a function that takes in $f$, and says: $$ \operatorname{row1-win}(f) \iff f(1) = X \wedge f(2) = X \wedge f(3) = X $$ and: $$ \operatorname{row1-can-win}(f) \iff \operatorname{row1-win}(\operatorname{Add-X}(f,1)) \vee \operatorname{row1-win}(\operatorname{Add-X}(f,2)) \vee \operatorname{row1-win}(\operatorname{Add-X}(f,3)) $$