The answers above don't really work in all cases, e.g. the Talkback mode.
I added an additional view on top of the EditText and assigned a click listener to it.
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ...
            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/textInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/textInputEditText"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>
            </com.google.android.material.textfield.TextInputLayout>
            <View
                android:id="@+id/btnTextInputLayout"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:background="?selectableItemBackground"
                app:layout_constraintBottom_toBottomOf="@+id/textInputLayout"
                app:layout_constraintEnd_toEndOf="@+id/textInputLayout"
                app:layout_constraintStart_toStartOf="@+id/textInputLayout"
                app:layout_constraintTop_toTopOf="@+id/textInputLayout" />
    ...
</androidx.constraintlayout.widget.ConstraintLayout>
Helper functions:
    private fun makeOverlayEditTextEditable(
        editText: EditText,
        clickOverlayView: View,
        inputType: Int
    ) {
        enableEditTextInput(editText, inputType)
        clickOverlayView.isVisible = false
    }
    private fun makeOverlayEditTextClickable(
        editText: EditText,
        clickOverlayView: View,
        clickListener: () -> Unit
    ) {
        disableEditTextInput(editText)
        clickOverlayView.setOnClickListener {
            clickListener()
        }
        clickOverlayView.isVisible = true
    }
    @SuppressLint("ClickableViewAccessibility")
    private fun disableEditTextInput(editText: EditText) {
        editText.inputType = InputType.TYPE_NULL
        editText.isFocusable = false
        editText.isFocusableInTouchMode = false
        editText.isClickable = false
        editText.setOnTouchListener { _, _ -> true }
    }
    @SuppressLint("ClickableViewAccessibility")
    private fun enableEditTextInput(editText: EditText, inputType: Int) {
        editText.inputType = inputType
        editText.isFocusable = true
        editText.isFocusableInTouchMode = true
        editText.isClickable = true
        editText.setOnTouchListener(null)
    }
Usage:
// Make EditText editable
makeOverlayEditTextEditable(
    editText = binding.textInputLayout,
    clickOverlayView = binding.btnTextInputLayout,
    inputType = InputType.TYPE_CLASS_TEXT
)
// Make EditText clickable
makeOverlayEditTextClickable(
    editText = binding.textInputLayout,
    clickOverlayView = binding.btnTextInputLayout,
) {
    // Handle click
}
If this pattern is used all across the application, it makes sense to abstract this logic in the custom view.